######## snakemake preamble start (automatically inserted, do not edit) ########
import sys;sys.path.extend(['/home/aloes/miniforge3/envs/seqneut-pipeline/lib/python3.12/site-packages', '/fh/fast/bloom_j/computational_notebooks/aloes/2025/flu_seqneut_pdmH1N1_2023-2024_VaccinatedCohorts/seqneut-pipeline', '/fh/fast/bloom_j/computational_notebooks/aloes/2025/flu_seqneut_pdmH1N1_2023-2024_VaccinatedCohorts', '/home/aloes/miniforge3/envs/seqneut-pipeline/bin', '/home/aloes/miniforge3/envs/seqneut-pipeline/lib/python3.12', '/home/aloes/miniforge3/envs/seqneut-pipeline/lib/python3.12/lib-dynload', '/home/aloes/miniforge3/envs/seqneut-pipeline/lib/python3.12/site-packages', '/home/aloes/.cache/snakemake/snakemake/source-cache/runtime-cache/tmpc8hdqlvv/file/fh/fast/bloom_j/computational_notebooks/aloes/2025/flu_seqneut_pdmH1N1_2023-2024_VaccinatedCohorts/seqneut-pipeline/notebooks', '/fh/fast/bloom_j/computational_notebooks/aloes/2025/flu_seqneut_pdmH1N1_2023-2024_VaccinatedCohorts/seqneut-pipeline/notebooks']);import pickle;from snakemake import script;script.snakemake = pickle.loads(b'\x80\x04\x95w\xcd\x00\x00\x00\x00\x00\x00\x8c\x10snakemake.script\x94\x8c\tSnakemake\x94\x93\x94)\x81\x94}\x94(\x8c\x05input\x94\x8c\x0csnakemake.io\x94\x8c\nInputFiles\x94\x93\x94)\x81\x94(\x8c+results/barcode_counts/plate13_none-1_0.csv\x94\x8c+results/barcode_counts/plate13_none-2_0.csv\x94\x8c+results/barcode_counts/plate13_none-3_0.csv\x94\x8c+results/barcode_counts/plate13_none-4_0.csv\x94\x8c+results/barcode_counts/plate13_none-5_0.csv\x94\x8c+results/barcode_counts/plate13_none-6_0.csv\x94\x8c+results/barcode_counts/plate13_none-7_0.csv\x94\x8c+results/barcode_counts/plate13_none-8_0.csv\x94\x8c:results/barcode_counts/plate13_DRIVE_y1985_s042_d30_40.csv\x94\x8c9results/barcode_counts/plate13_DRIVE_y1985_s042_d0_40.csv\x94\x8c:results/barcode_counts/plate13_DRIVE_y1980_s002_d30_40.csv\x94\x8c9results/barcode_counts/plate13_DRIVE_y1980_s002_d0_40.csv\x94\x8c:results/barcode_counts/plate13_DRIVE_y1998_s025_d30_40.csv\x94\x8c9results/barcode_counts/plate13_DRIVE_y1998_s025_d0_40.csv\x94\x8c:results/barcode_counts/plate13_DRIVE_y1999_s013_d30_40.csv\x94\x8c9results/barcode_counts/plate13_DRIVE_y1999_s013_d0_40.csv\x94\x8c:results/barcode_counts/plate13_DRIVE_y1985_s042_d30_80.csv\x94\x8c9results/barcode_counts/plate13_DRIVE_y1985_s042_d0_80.csv\x94\x8c:results/barcode_counts/plate13_DRIVE_y1980_s002_d30_80.csv\x94\x8c9results/barcode_counts/plate13_DRIVE_y1980_s002_d0_80.csv\x94\x8c:results/barcode_counts/plate13_DRIVE_y1998_s025_d30_80.csv\x94\x8c9results/barcode_counts/plate13_DRIVE_y1998_s025_d0_80.csv\x94\x8c:results/barcode_counts/plate13_DRIVE_y1999_s013_d30_80.csv\x94\x8c9results/barcode_counts/plate13_DRIVE_y1999_s013_d0_80.csv\x94\x8c;results/barcode_counts/plate13_DRIVE_y1985_s042_d30_160.csv\x94\x8c:results/barcode_counts/plate13_DRIVE_y1985_s042_d0_160.csv\x94\x8c;results/barcode_counts/plate13_DRIVE_y1980_s002_d30_160.csv\x94\x8c:results/barcode_counts/plate13_DRIVE_y1980_s002_d0_160.csv\x94\x8c;results/barcode_counts/plate13_DRIVE_y1998_s025_d30_160.csv\x94\x8c:results/barcode_counts/plate13_DRIVE_y1998_s025_d0_160.csv\x94\x8c;results/barcode_counts/plate13_DRIVE_y1999_s013_d30_160.csv\x94\x8c:results/barcode_counts/plate13_DRIVE_y1999_s013_d0_160.csv\x94\x8c;results/barcode_counts/plate13_DRIVE_y1985_s042_d30_320.csv\x94\x8c:results/barcode_counts/plate13_DRIVE_y1985_s042_d0_320.csv\x94\x8c;results/barcode_counts/plate13_DRIVE_y1980_s002_d30_320.csv\x94\x8c:results/barcode_counts/plate13_DRIVE_y1980_s002_d0_320.csv\x94\x8c;results/barcode_counts/plate13_DRIVE_y1998_s025_d30_320.csv\x94\x8c:results/barcode_counts/plate13_DRIVE_y1998_s025_d0_320.csv\x94\x8c;results/barcode_counts/plate13_DRIVE_y1999_s013_d30_320.csv\x94\x8c:results/barcode_counts/plate13_DRIVE_y1999_s013_d0_320.csv\x94\x8c;results/barcode_counts/plate13_DRIVE_y1985_s042_d30_640.csv\x94\x8c:results/barcode_counts/plate13_DRIVE_y1985_s042_d0_640.csv\x94\x8c;results/barcode_counts/plate13_DRIVE_y1980_s002_d30_640.csv\x94\x8c:results/barcode_counts/plate13_DRIVE_y1980_s002_d0_640.csv\x94\x8c;results/barcode_counts/plate13_DRIVE_y1998_s025_d30_640.csv\x94\x8c:results/barcode_counts/plate13_DRIVE_y1998_s025_d0_640.csv\x94\x8c;results/barcode_counts/plate13_DRIVE_y1999_s013_d30_640.csv\x94\x8c:results/barcode_counts/plate13_DRIVE_y1999_s013_d0_640.csv\x94\x8c<results/barcode_counts/plate13_DRIVE_y1985_s042_d30_1280.csv\x94\x8c;results/barcode_counts/plate13_DRIVE_y1985_s042_d0_1280.csv\x94\x8c<results/barcode_counts/plate13_DRIVE_y1980_s002_d30_1280.csv\x94\x8c;results/barcode_counts/plate13_DRIVE_y1980_s002_d0_1280.csv\x94\x8c<results/barcode_counts/plate13_DRIVE_y1998_s025_d30_1280.csv\x94\x8c;results/barcode_counts/plate13_DRIVE_y1998_s025_d0_1280.csv\x94\x8c<results/barcode_counts/plate13_DRIVE_y1999_s013_d30_1280.csv\x94\x8c;results/barcode_counts/plate13_DRIVE_y1999_s013_d0_1280.csv\x94\x8c<results/barcode_counts/plate13_DRIVE_y1985_s042_d30_2560.csv\x94\x8c;results/barcode_counts/plate13_DRIVE_y1985_s042_d0_2560.csv\x94\x8c<results/barcode_counts/plate13_DRIVE_y1980_s002_d30_2560.csv\x94\x8c;results/barcode_counts/plate13_DRIVE_y1980_s002_d0_2560.csv\x94\x8c<results/barcode_counts/plate13_DRIVE_y1998_s025_d30_2560.csv\x94\x8c;results/barcode_counts/plate13_DRIVE_y1998_s025_d0_2560.csv\x94\x8c<results/barcode_counts/plate13_DRIVE_y1999_s013_d30_2560.csv\x94\x8c;results/barcode_counts/plate13_DRIVE_y1999_s013_d0_2560.csv\x94\x8c<results/barcode_counts/plate13_DRIVE_y1985_s042_d30_5120.csv\x94\x8c;results/barcode_counts/plate13_DRIVE_y1985_s042_d0_5120.csv\x94\x8c<results/barcode_counts/plate13_DRIVE_y1980_s002_d30_5120.csv\x94\x8c;results/barcode_counts/plate13_DRIVE_y1980_s002_d0_5120.csv\x94\x8c<results/barcode_counts/plate13_DRIVE_y1998_s025_d30_5120.csv\x94\x8c;results/barcode_counts/plate13_DRIVE_y1998_s025_d0_5120.csv\x94\x8c<results/barcode_counts/plate13_DRIVE_y1999_s013_d30_5120.csv\x94\x8c;results/barcode_counts/plate13_DRIVE_y1999_s013_d0_5120.csv\x94\x8c=results/barcode_counts/plate13_DRIVE_y1985_s042_d30_10240.csv\x94\x8c<results/barcode_counts/plate13_DRIVE_y1985_s042_d0_10240.csv\x94\x8c=results/barcode_counts/plate13_DRIVE_y1980_s002_d30_10240.csv\x94\x8c<results/barcode_counts/plate13_DRIVE_y1980_s002_d0_10240.csv\x94\x8c=results/barcode_counts/plate13_DRIVE_y1998_s025_d30_10240.csv\x94\x8c<results/barcode_counts/plate13_DRIVE_y1998_s025_d0_10240.csv\x94\x8c=results/barcode_counts/plate13_DRIVE_y1999_s013_d30_10240.csv\x94\x8c<results/barcode_counts/plate13_DRIVE_y1999_s013_d0_10240.csv\x94\x8c=results/barcode_counts/plate13_DRIVE_y1985_s042_d30_20480.csv\x94\x8c<results/barcode_counts/plate13_DRIVE_y1985_s042_d0_20480.csv\x94\x8c=results/barcode_counts/plate13_DRIVE_y1980_s002_d30_20480.csv\x94\x8c<results/barcode_counts/plate13_DRIVE_y1980_s002_d0_20480.csv\x94\x8c=results/barcode_counts/plate13_DRIVE_y1998_s025_d30_20480.csv\x94\x8c<results/barcode_counts/plate13_DRIVE_y1998_s025_d0_20480.csv\x94\x8c=results/barcode_counts/plate13_DRIVE_y1999_s013_d30_20480.csv\x94\x8c<results/barcode_counts/plate13_DRIVE_y1999_s013_d0_20480.csv\x94\x8c=results/barcode_counts/plate13_DRIVE_y1985_s042_d30_40960.csv\x94\x8c<results/barcode_counts/plate13_DRIVE_y1985_s042_d0_40960.csv\x94\x8c=results/barcode_counts/plate13_DRIVE_y1980_s002_d30_40960.csv\x94\x8c<results/barcode_counts/plate13_DRIVE_y1980_s002_d0_40960.csv\x94\x8c=results/barcode_counts/plate13_DRIVE_y1998_s025_d30_40960.csv\x94\x8c<results/barcode_counts/plate13_DRIVE_y1998_s025_d0_40960.csv\x94\x8c=results/barcode_counts/plate13_DRIVE_y1999_s013_d30_40960.csv\x94\x8c<results/barcode_counts/plate13_DRIVE_y1999_s013_d0_40960.csv\x94\x8c*results/barcode_fates/plate13_none-1_0.csv\x94\x8c*results/barcode_fates/plate13_none-2_0.csv\x94\x8c*results/barcode_fates/plate13_none-3_0.csv\x94\x8c*results/barcode_fates/plate13_none-4_0.csv\x94\x8c*results/barcode_fates/plate13_none-5_0.csv\x94\x8c*results/barcode_fates/plate13_none-6_0.csv\x94\x8c*results/barcode_fates/plate13_none-7_0.csv\x94\x8c*results/barcode_fates/plate13_none-8_0.csv\x94\x8c9results/barcode_fates/plate13_DRIVE_y1985_s042_d30_40.csv\x94\x8c8results/barcode_fates/plate13_DRIVE_y1985_s042_d0_40.csv\x94\x8c9results/barcode_fates/plate13_DRIVE_y1980_s002_d30_40.csv\x94\x8c8results/barcode_fates/plate13_DRIVE_y1980_s002_d0_40.csv\x94\x8c9results/barcode_fates/plate13_DRIVE_y1998_s025_d30_40.csv\x94\x8c8results/barcode_fates/plate13_DRIVE_y1998_s025_d0_40.csv\x94\x8c9results/barcode_fates/plate13_DRIVE_y1999_s013_d30_40.csv\x94\x8c8results/barcode_fates/plate13_DRIVE_y1999_s013_d0_40.csv\x94\x8c9results/barcode_fates/plate13_DRIVE_y1985_s042_d30_80.csv\x94\x8c8results/barcode_fates/plate13_DRIVE_y1985_s042_d0_80.csv\x94\x8c9results/barcode_fates/plate13_DRIVE_y1980_s002_d30_80.csv\x94\x8c8results/barcode_fates/plate13_DRIVE_y1980_s002_d0_80.csv\x94\x8c9results/barcode_fates/plate13_DRIVE_y1998_s025_d30_80.csv\x94\x8c8results/barcode_fates/plate13_DRIVE_y1998_s025_d0_80.csv\x94\x8c9results/barcode_fates/plate13_DRIVE_y1999_s013_d30_80.csv\x94\x8c8results/barcode_fates/plate13_DRIVE_y1999_s013_d0_80.csv\x94\x8c:results/barcode_fates/plate13_DRIVE_y1985_s042_d30_160.csv\x94\x8c9results/barcode_fates/plate13_DRIVE_y1985_s042_d0_160.csv\x94\x8c:results/barcode_fates/plate13_DRIVE_y1980_s002_d30_160.csv\x94\x8c9results/barcode_fates/plate13_DRIVE_y1980_s002_d0_160.csv\x94\x8c:results/barcode_fates/plate13_DRIVE_y1998_s025_d30_160.csv\x94\x8c9results/barcode_fates/plate13_DRIVE_y1998_s025_d0_160.csv\x94\x8c:results/barcode_fates/plate13_DRIVE_y1999_s013_d30_160.csv\x94\x8c9results/barcode_fates/plate13_DRIVE_y1999_s013_d0_160.csv\x94\x8c:results/barcode_fates/plate13_DRIVE_y1985_s042_d30_320.csv\x94\x8c9results/barcode_fates/plate13_DRIVE_y1985_s042_d0_320.csv\x94\x8c:results/barcode_fates/plate13_DRIVE_y1980_s002_d30_320.csv\x94\x8c9results/barcode_fates/plate13_DRIVE_y1980_s002_d0_320.csv\x94\x8c:results/barcode_fates/plate13_DRIVE_y1998_s025_d30_320.csv\x94\x8c9results/barcode_fates/plate13_DRIVE_y1998_s025_d0_320.csv\x94\x8c:results/barcode_fates/plate13_DRIVE_y1999_s013_d30_320.csv\x94\x8c9results/barcode_fates/plate13_DRIVE_y1999_s013_d0_320.csv\x94\x8c:results/barcode_fates/plate13_DRIVE_y1985_s042_d30_640.csv\x94\x8c9results/barcode_fates/plate13_DRIVE_y1985_s042_d0_640.csv\x94\x8c:results/barcode_fates/plate13_DRIVE_y1980_s002_d30_640.csv\x94\x8c9results/barcode_fates/plate13_DRIVE_y1980_s002_d0_640.csv\x94\x8c:results/barcode_fates/plate13_DRIVE_y1998_s025_d30_640.csv\x94\x8c9results/barcode_fates/plate13_DRIVE_y1998_s025_d0_640.csv\x94\x8c:results/barcode_fates/plate13_DRIVE_y1999_s013_d30_640.csv\x94\x8c9results/barcode_fates/plate13_DRIVE_y1999_s013_d0_640.csv\x94\x8c;results/barcode_fates/plate13_DRIVE_y1985_s042_d30_1280.csv\x94\x8c:results/barcode_fates/plate13_DRIVE_y1985_s042_d0_1280.csv\x94\x8c;results/barcode_fates/plate13_DRIVE_y1980_s002_d30_1280.csv\x94\x8c:results/barcode_fates/plate13_DRIVE_y1980_s002_d0_1280.csv\x94\x8c;results/barcode_fates/plate13_DRIVE_y1998_s025_d30_1280.csv\x94\x8c:results/barcode_fates/plate13_DRIVE_y1998_s025_d0_1280.csv\x94\x8c;results/barcode_fates/plate13_DRIVE_y1999_s013_d30_1280.csv\x94\x8c:results/barcode_fates/plate13_DRIVE_y1999_s013_d0_1280.csv\x94\x8c;results/barcode_fates/plate13_DRIVE_y1985_s042_d30_2560.csv\x94\x8c:results/barcode_fates/plate13_DRIVE_y1985_s042_d0_2560.csv\x94\x8c;results/barcode_fates/plate13_DRIVE_y1980_s002_d30_2560.csv\x94\x8c:results/barcode_fates/plate13_DRIVE_y1980_s002_d0_2560.csv\x94\x8c;results/barcode_fates/plate13_DRIVE_y1998_s025_d30_2560.csv\x94\x8c:results/barcode_fates/plate13_DRIVE_y1998_s025_d0_2560.csv\x94\x8c;results/barcode_fates/plate13_DRIVE_y1999_s013_d30_2560.csv\x94\x8c:results/barcode_fates/plate13_DRIVE_y1999_s013_d0_2560.csv\x94\x8c;results/barcode_fates/plate13_DRIVE_y1985_s042_d30_5120.csv\x94\x8c:results/barcode_fates/plate13_DRIVE_y1985_s042_d0_5120.csv\x94\x8c;results/barcode_fates/plate13_DRIVE_y1980_s002_d30_5120.csv\x94\x8c:results/barcode_fates/plate13_DRIVE_y1980_s002_d0_5120.csv\x94\x8c;results/barcode_fates/plate13_DRIVE_y1998_s025_d30_5120.csv\x94\x8c:results/barcode_fates/plate13_DRIVE_y1998_s025_d0_5120.csv\x94\x8c;results/barcode_fates/plate13_DRIVE_y1999_s013_d30_5120.csv\x94\x8c:results/barcode_fates/plate13_DRIVE_y1999_s013_d0_5120.csv\x94\x8c<results/barcode_fates/plate13_DRIVE_y1985_s042_d30_10240.csv\x94\x8c;results/barcode_fates/plate13_DRIVE_y1985_s042_d0_10240.csv\x94\x8c<results/barcode_fates/plate13_DRIVE_y1980_s002_d30_10240.csv\x94\x8c;results/barcode_fates/plate13_DRIVE_y1980_s002_d0_10240.csv\x94\x8c<results/barcode_fates/plate13_DRIVE_y1998_s025_d30_10240.csv\x94\x8c;results/barcode_fates/plate13_DRIVE_y1998_s025_d0_10240.csv\x94\x8c<results/barcode_fates/plate13_DRIVE_y1999_s013_d30_10240.csv\x94\x8c;results/barcode_fates/plate13_DRIVE_y1999_s013_d0_10240.csv\x94\x8c<results/barcode_fates/plate13_DRIVE_y1985_s042_d30_20480.csv\x94\x8c;results/barcode_fates/plate13_DRIVE_y1985_s042_d0_20480.csv\x94\x8c<results/barcode_fates/plate13_DRIVE_y1980_s002_d30_20480.csv\x94\x8c;results/barcode_fates/plate13_DRIVE_y1980_s002_d0_20480.csv\x94\x8c<results/barcode_fates/plate13_DRIVE_y1998_s025_d30_20480.csv\x94\x8c;results/barcode_fates/plate13_DRIVE_y1998_s025_d0_20480.csv\x94\x8c<results/barcode_fates/plate13_DRIVE_y1999_s013_d30_20480.csv\x94\x8c;results/barcode_fates/plate13_DRIVE_y1999_s013_d0_20480.csv\x94\x8c<results/barcode_fates/plate13_DRIVE_y1985_s042_d30_40960.csv\x94\x8c;results/barcode_fates/plate13_DRIVE_y1985_s042_d0_40960.csv\x94\x8c<results/barcode_fates/plate13_DRIVE_y1980_s002_d30_40960.csv\x94\x8c;results/barcode_fates/plate13_DRIVE_y1980_s002_d0_40960.csv\x94\x8c<results/barcode_fates/plate13_DRIVE_y1998_s025_d30_40960.csv\x94\x8c;results/barcode_fates/plate13_DRIVE_y1998_s025_d0_40960.csv\x94\x8c<results/barcode_fates/plate13_DRIVE_y1999_s013_d30_40960.csv\x94\x8c;results/barcode_fates/plate13_DRIVE_y1999_s013_d0_40960.csv\x94\x8c*data/viral_libraries/H1N1_2023_library.csv\x94\x8c3data/neut_standard_sets/loes2023_neut_standards.csv\x94e}\x94(\x8c\x06_names\x94}\x94(\x8c\ncount_csvs\x94K\x00K`\x86\x94\x8c\tfate_csvs\x94K`K\xc0\x86\x94\x8c\x11viral_library_csv\x94K\xc0N\x86\x94\x8c\x15neut_standard_set_csv\x94K\xc1N\x86\x94u\x8c\x12_allowed_overrides\x94]\x94(\x8c\x05index\x94\x8c\x04sort\x94eh\xd9h\x06\x8c\x0eAttributeGuard\x94\x93\x94)\x81\x94}\x94\x8c\x04name\x94h\xd9sbh\xdah\xdc)\x81\x94}\x94h\xdfh\xdasbh\xcfh\x06\x8c\tNamedlist\x94\x93\x94)\x81\x94(h\nh\x0bh\x0ch\rh\x0eh\x0fh\x10h\x11h\x12h\x13h\x14h\x15h\x16h\x17h\x18h\x19h\x1ah\x1bh\x1ch\x1dh\x1eh\x1fh h!h"h#h$h%h&h\'h(h)h*h+h,h-h.h/h0h1h2h3h4h5h6h7h8h9h:h;h<h=h>h?h@hAhBhChDhEhFhGhHhIhJhKhLhMhNhOhPhQhRhShThUhVhWhXhYhZh[h\\h]h^h_h`hahbhchdhehfhghhhie}\x94(h\xcd}\x94h\xd7]\x94(h\xd9h\xdaeh\xd9h\xdc)\x81\x94}\x94h\xdfh\xd9sbh\xdah\xdc)\x81\x94}\x94h\xdfh\xdasbubh\xd1h\xe3)\x81\x94(hjhkhlhmhnhohphqhrhshthuhvhwhxhyhzh{h|h}h~h\x7fh\x80h\x81h\x82h\x83h\x84h\x85h\x86h\x87h\x88h\x89h\x8ah\x8bh\x8ch\x8dh\x8eh\x8fh\x90h\x91h\x92h\x93h\x94h\x95h\x96h\x97h\x98h\x99h\x9ah\x9bh\x9ch\x9dh\x9eh\x9fh\xa0h\xa1h\xa2h\xa3h\xa4h\xa5h\xa6h\xa7h\xa8h\xa9h\xaah\xabh\xach\xadh\xaeh\xafh\xb0h\xb1h\xb2h\xb3h\xb4h\xb5h\xb6h\xb7h\xb8h\xb9h\xbah\xbbh\xbch\xbdh\xbeh\xbfh\xc0h\xc1h\xc2h\xc3h\xc4h\xc5h\xc6h\xc7h\xc8h\xc9e}\x94(h\xcd}\x94h\xd7]\x94(h\xd9h\xdaeh\xd9h\xdc)\x81\x94}\x94h\xdfh\xd9sbh\xdah\xdc)\x81\x94}\x94h\xdfh\xdasbubh\xd3h\xcah\xd5h\xcbub\x8c\x06output\x94h\x06\x8c\x0bOutputFiles\x94\x93\x94)\x81\x94(\x8c#results/plates/plate13/qc_drops.yml\x94\x8c+results/plates/plate13/frac_infectivity.csv\x94\x8c$results/plates/plate13/curvefits.csv\x94\x8c\'results/plates/plate13/curvefits.pickle\x94e}\x94(h\xcd}\x94(\x8c\x08qc_drops\x94K\x00N\x86\x94\x8c\x14frac_infectivity_csv\x94K\x01N\x86\x94\x8c\x08fits_csv\x94K\x02N\x86\x94\x8c\x0bfits_pickle\x94K\x03N\x86\x94uh\xd7]\x94(h\xd9h\xdaeh\xd9h\xdc)\x81\x94}\x94h\xdfh\xd9sbh\xdah\xdc)\x81\x94}\x94h\xdfh\xdasbh\xfeh\xf8j\x00\x01\x00\x00h\xf9j\x02\x01\x00\x00h\xfaj\x04\x01\x00\x00h\xfbub\x8c\x06params\x94h\x06\x8c\x06Params\x94\x93\x94)\x81\x94(]\x94(\x8c\x10plate13_none-1_0\x94\x8c\x10plate13_none-2_0\x94\x8c\x10plate13_none-3_0\x94\x8c\x10plate13_none-4_0\x94\x8c\x10plate13_none-5_0\x94\x8c\x10plate13_none-6_0\x94\x8c\x10plate13_none-7_0\x94\x8c\x10plate13_none-8_0\x94\x8c\x1fplate13_DRIVE_y1985_s042_d30_40\x94\x8c\x1eplate13_DRIVE_y1985_s042_d0_40\x94\x8c\x1fplate13_DRIVE_y1980_s002_d30_40\x94\x8c\x1eplate13_DRIVE_y1980_s002_d0_40\x94\x8c\x1fplate13_DRIVE_y1998_s025_d30_40\x94\x8c\x1eplate13_DRIVE_y1998_s025_d0_40\x94\x8c\x1fplate13_DRIVE_y1999_s013_d30_40\x94\x8c\x1eplate13_DRIVE_y1999_s013_d0_40\x94\x8c\x1fplate13_DRIVE_y1985_s042_d30_80\x94\x8c\x1eplate13_DRIVE_y1985_s042_d0_80\x94\x8c\x1fplate13_DRIVE_y1980_s002_d30_80\x94\x8c\x1eplate13_DRIVE_y1980_s002_d0_80\x94\x8c\x1fplate13_DRIVE_y1998_s025_d30_80\x94\x8c\x1eplate13_DRIVE_y1998_s025_d0_80\x94\x8c\x1fplate13_DRIVE_y1999_s013_d30_80\x94\x8c\x1eplate13_DRIVE_y1999_s013_d0_80\x94\x8c plate13_DRIVE_y1985_s042_d30_160\x94\x8c\x1fplate13_DRIVE_y1985_s042_d0_160\x94\x8c plate13_DRIVE_y1980_s002_d30_160\x94\x8c\x1fplate13_DRIVE_y1980_s002_d0_160\x94\x8c plate13_DRIVE_y1998_s025_d30_160\x94\x8c\x1fplate13_DRIVE_y1998_s025_d0_160\x94\x8c plate13_DRIVE_y1999_s013_d30_160\x94\x8c\x1fplate13_DRIVE_y1999_s013_d0_160\x94\x8c plate13_DRIVE_y1985_s042_d30_320\x94\x8c\x1fplate13_DRIVE_y1985_s042_d0_320\x94\x8c plate13_DRIVE_y1980_s002_d30_320\x94\x8c\x1fplate13_DRIVE_y1980_s002_d0_320\x94\x8c plate13_DRIVE_y1998_s025_d30_320\x94\x8c\x1fplate13_DRIVE_y1998_s025_d0_320\x94\x8c plate13_DRIVE_y1999_s013_d30_320\x94\x8c\x1fplate13_DRIVE_y1999_s013_d0_320\x94\x8c plate13_DRIVE_y1985_s042_d30_640\x94\x8c\x1fplate13_DRIVE_y1985_s042_d0_640\x94\x8c plate13_DRIVE_y1980_s002_d30_640\x94\x8c\x1fplate13_DRIVE_y1980_s002_d0_640\x94\x8c plate13_DRIVE_y1998_s025_d30_640\x94\x8c\x1fplate13_DRIVE_y1998_s025_d0_640\x94\x8c plate13_DRIVE_y1999_s013_d30_640\x94\x8c\x1fplate13_DRIVE_y1999_s013_d0_640\x94\x8c!plate13_DRIVE_y1985_s042_d30_1280\x94\x8c plate13_DRIVE_y1985_s042_d0_1280\x94\x8c!plate13_DRIVE_y1980_s002_d30_1280\x94\x8c plate13_DRIVE_y1980_s002_d0_1280\x94\x8c!plate13_DRIVE_y1998_s025_d30_1280\x94\x8c plate13_DRIVE_y1998_s025_d0_1280\x94\x8c!plate13_DRIVE_y1999_s013_d30_1280\x94\x8c plate13_DRIVE_y1999_s013_d0_1280\x94\x8c!plate13_DRIVE_y1985_s042_d30_2560\x94\x8c plate13_DRIVE_y1985_s042_d0_2560\x94\x8c!plate13_DRIVE_y1980_s002_d30_2560\x94\x8c plate13_DRIVE_y1980_s002_d0_2560\x94\x8c!plate13_DRIVE_y1998_s025_d30_2560\x94\x8c plate13_DRIVE_y1998_s025_d0_2560\x94\x8c!plate13_DRIVE_y1999_s013_d30_2560\x94\x8c plate13_DRIVE_y1999_s013_d0_2560\x94\x8c!plate13_DRIVE_y1985_s042_d30_5120\x94\x8c plate13_DRIVE_y1985_s042_d0_5120\x94\x8c!plate13_DRIVE_y1980_s002_d30_5120\x94\x8c plate13_DRIVE_y1980_s002_d0_5120\x94\x8c!plate13_DRIVE_y1998_s025_d30_5120\x94\x8c plate13_DRIVE_y1998_s025_d0_5120\x94\x8c!plate13_DRIVE_y1999_s013_d30_5120\x94\x8c plate13_DRIVE_y1999_s013_d0_5120\x94\x8c"plate13_DRIVE_y1985_s042_d30_10240\x94\x8c!plate13_DRIVE_y1985_s042_d0_10240\x94\x8c"plate13_DRIVE_y1980_s002_d30_10240\x94\x8c!plate13_DRIVE_y1980_s002_d0_10240\x94\x8c"plate13_DRIVE_y1998_s025_d30_10240\x94\x8c!plate13_DRIVE_y1998_s025_d0_10240\x94\x8c"plate13_DRIVE_y1999_s013_d30_10240\x94\x8c!plate13_DRIVE_y1999_s013_d0_10240\x94\x8c"plate13_DRIVE_y1985_s042_d30_20480\x94\x8c!plate13_DRIVE_y1985_s042_d0_20480\x94\x8c"plate13_DRIVE_y1980_s002_d30_20480\x94\x8c!plate13_DRIVE_y1980_s002_d0_20480\x94\x8c"plate13_DRIVE_y1998_s025_d30_20480\x94\x8c!plate13_DRIVE_y1998_s025_d0_20480\x94\x8c"plate13_DRIVE_y1999_s013_d30_20480\x94\x8c!plate13_DRIVE_y1999_s013_d0_20480\x94\x8c"plate13_DRIVE_y1985_s042_d30_40960\x94\x8c!plate13_DRIVE_y1985_s042_d0_40960\x94\x8c"plate13_DRIVE_y1980_s002_d30_40960\x94\x8c!plate13_DRIVE_y1980_s002_d0_40960\x94\x8c"plate13_DRIVE_y1998_s025_d30_40960\x94\x8c!plate13_DRIVE_y1998_s025_d0_40960\x94\x8c"plate13_DRIVE_y1999_s013_d30_40960\x94\x8c!plate13_DRIVE_y1999_s013_d0_40960\x94e}\x94(\x8c\x05group\x94\x8c\x05DRIVE\x94\x8c\x04date\x94\x8c\n2024-12-23\x94\x8c\rviral_library\x94\x8c\x0epdmH1N1Lib2023\x94\x8c\x11neut_standard_set\x94\x8c\x08loes2023\x94\x8c\x0bsamples_csv\x94\x8c$data/plates/plate20_DRIVE_plateB.csv\x94\x8c\x0cmanual_drops\x94}\x94\x8c\rqc_thresholds\x94}\x94(\x8c\x1bavg_barcode_counts_per_well\x94M\xf4\x01\x8c\x1fmin_neut_standard_frac_per_well\x94G?tz\xe1G\xae\x14{\x8c"no_serum_per_viral_barcode_filters\x94}\x94(\x8c\x08min_frac\x94G?\x04\xf8\xb5\x88\xe3h\xf1\x8c\x0fmax_fold_change\x94K\x04\x8c\tmax_wells\x94K\x02u\x8c!per_neut_standard_barcode_filters\x94}\x94(\x8c\x08min_frac\x94G?*6\xe2\xeb\x1cC-\x8c\x0fmax_fold_change\x94K\x04\x8c\tmax_wells\x94K\x02u\x8c min_neut_standard_count_per_well\x94M\xf4\x01\x8c)min_no_serum_count_per_viral_barcode_well\x94K2\x8c+max_frac_infectivity_per_viral_barcode_well\x94K\x04\x8c)min_dilutions_per_barcode_serum_replicate\x94K\x05u\x8c\x0fcurvefit_params\x94}\x94(\x8c\x18frac_infectivity_ceiling\x94K\x01\x8c\x06fixtop\x94]\x94(G?\xe3333333K\x01e\x8c\tfixbottom\x94K\x00\x8c\x08fixslope\x94]\x94(G?\xe9\x99\x99\x99\x99\x99\x9aK\neu\x8c\x0bcurvefit_qc\x94}\x94(\x8c\x1dmax_frac_infectivity_at_least\x94K\x00\x8c\x0fgoodness_of_fit\x94}\x94(\x8c\x06min_R2\x94G?\xe6ffffff\x8c\x08max_RMSD\x94G?\xc9\x99\x99\x99\x99\x99\x9au\x8c#serum_replicates_ignore_curvefit_qc\x94]\x94\x8c+barcode_serum_replicates_ignore_curvefit_qc\x94]\x94u\x8c\x1eillumina_barcode_parser_params\x94}\x94(\x8c\x08upstream\x94\x8c\x1cCCTACAATGTCGGATTTGTATTTAATAG\x94\x8c\ndownstream\x94\x8c\x00\x94\x8c\x04minq\x94K\x14\x8c\x11upstream_mismatch\x94K\x04\x8c\x0ebc_orientation\x94\x8c\x02R2\x94\x8c\tupstream2\x94\x8c\x06ATCGAT\x94\x8c\x12upstream2_mismatch\x94K\x01u\x8c\x07samples\x94}\x94(\x8c\x04well\x94}\x94(K\x00\x8c\x02A1\x94K\x01\x8c\x02B1\x94K\x02\x8c\x02C1\x94K\x03\x8c\x02D1\x94K\x04\x8c\x02E1\x94K\x05\x8c\x02F1\x94K\x06\x8c\x02G1\x94K\x07\x8c\x02H1\x94K\x08\x8c\x02A2\x94K\t\x8c\x02B2\x94K\n\x8c\x02C2\x94K\x0b\x8c\x02D2\x94K\x0c\x8c\x02E2\x94K\r\x8c\x02F2\x94K\x0e\x8c\x02G2\x94K\x0f\x8c\x02H2\x94K\x10\x8c\x02A3\x94K\x11\x8c\x02B3\x94K\x12\x8c\x02C3\x94K\x13\x8c\x02D3\x94K\x14\x8c\x02E3\x94K\x15\x8c\x02F3\x94K\x16\x8c\x02G3\x94K\x17\x8c\x02H3\x94K\x18\x8c\x02A4\x94K\x19\x8c\x02B4\x94K\x1a\x8c\x02C4\x94K\x1b\x8c\x02D4\x94K\x1c\x8c\x02E4\x94K\x1d\x8c\x02F4\x94K\x1e\x8c\x02G4\x94K\x1f\x8c\x02H4\x94K \x8c\x02A5\x94K!\x8c\x02B5\x94K"\x8c\x02C5\x94K#\x8c\x02D5\x94K$\x8c\x02E5\x94K%\x8c\x02F5\x94K&\x8c\x02G5\x94K\'\x8c\x02H5\x94K(\x8c\x02A6\x94K)\x8c\x02B6\x94K*\x8c\x02C6\x94K+\x8c\x02D6\x94K,\x8c\x02E6\x94K-\x8c\x02F6\x94K.\x8c\x02G6\x94K/\x8c\x02H6\x94K0\x8c\x02A7\x94K1\x8c\x02B7\x94K2\x8c\x02C7\x94K3\x8c\x02D7\x94K4\x8c\x02E7\x94K5\x8c\x02F7\x94K6\x8c\x02G7\x94K7\x8c\x02H7\x94K8\x8c\x02A8\x94K9\x8c\x02B8\x94K:\x8c\x02C8\x94K;\x8c\x02D8\x94K<\x8c\x02E8\x94K=\x8c\x02F8\x94K>\x8c\x02G8\x94K?\x8c\x02H8\x94K@\x8c\x02A9\x94KA\x8c\x02B9\x94KB\x8c\x02C9\x94KC\x8c\x02D9\x94KD\x8c\x02E9\x94KE\x8c\x02F9\x94KF\x8c\x02G9\x94KG\x8c\x02H9\x94KH\x8c\x03A10\x94KI\x8c\x03B10\x94KJ\x8c\x03C10\x94KK\x8c\x03D10\x94KL\x8c\x03E10\x94KM\x8c\x03F10\x94KN\x8c\x03G10\x94KO\x8c\x03H10\x94KP\x8c\x03A11\x94KQ\x8c\x03B11\x94KR\x8c\x03C11\x94KS\x8c\x03D11\x94KT\x8c\x03E11\x94KU\x8c\x03F11\x94KV\x8c\x03G11\x94KW\x8c\x03H11\x94KX\x8c\x03A12\x94KY\x8c\x03B12\x94KZ\x8c\x03C12\x94K[\x8c\x03D12\x94K\\\x8c\x03E12\x94K]\x8c\x03F12\x94K^\x8c\x03G12\x94K_\x8c\x03H12\x94u\x8c\x05serum\x94}\x94(K\x00\x8c\x04none\x94K\x01j\x15\x02\x00\x00K\x02j\x15\x02\x00\x00K\x03j\x15\x02\x00\x00K\x04j\x15\x02\x00\x00K\x05j\x15\x02\x00\x00K\x06j\x15\x02\x00\x00K\x07j\x15\x02\x00\x00K\x08\x8c\x14DRIVE_y1985_s042_d30\x94K\t\x8c\x13DRIVE_y1985_s042_d0\x94K\n\x8c\x14DRIVE_y1980_s002_d30\x94K\x0b\x8c\x13DRIVE_y1980_s002_d0\x94K\x0c\x8c\x14DRIVE_y1998_s025_d30\x94K\r\x8c\x13DRIVE_y1998_s025_d0\x94K\x0e\x8c\x14DRIVE_y1999_s013_d30\x94K\x0f\x8c\x13DRIVE_y1999_s013_d0\x94K\x10j\x16\x02\x00\x00K\x11j\x17\x02\x00\x00K\x12j\x18\x02\x00\x00K\x13j\x19\x02\x00\x00K\x14j\x1a\x02\x00\x00K\x15j\x1b\x02\x00\x00K\x16j\x1c\x02\x00\x00K\x17j\x1d\x02\x00\x00K\x18j\x16\x02\x00\x00K\x19j\x17\x02\x00\x00K\x1aj\x18\x02\x00\x00K\x1bj\x19\x02\x00\x00K\x1cj\x1a\x02\x00\x00K\x1dj\x1b\x02\x00\x00K\x1ej\x1c\x02\x00\x00K\x1fj\x1d\x02\x00\x00K j\x16\x02\x00\x00K!j\x17\x02\x00\x00K"j\x18\x02\x00\x00K#j\x19\x02\x00\x00K$j\x1a\x02\x00\x00K%j\x1b\x02\x00\x00K&j\x1c\x02\x00\x00K\'j\x1d\x02\x00\x00K(j\x16\x02\x00\x00K)j\x17\x02\x00\x00K*j\x18\x02\x00\x00K+j\x19\x02\x00\x00K,j\x1a\x02\x00\x00K-j\x1b\x02\x00\x00K.j\x1c\x02\x00\x00K/j\x1d\x02\x00\x00K0j\x16\x02\x00\x00K1j\x17\x02\x00\x00K2j\x18\x02\x00\x00K3j\x19\x02\x00\x00K4j\x1a\x02\x00\x00K5j\x1b\x02\x00\x00K6j\x1c\x02\x00\x00K7j\x1d\x02\x00\x00K8j\x16\x02\x00\x00K9j\x17\x02\x00\x00K:j\x18\x02\x00\x00K;j\x19\x02\x00\x00K<j\x1a\x02\x00\x00K=j\x1b\x02\x00\x00K>j\x1c\x02\x00\x00K?j\x1d\x02\x00\x00K@j\x16\x02\x00\x00KAj\x17\x02\x00\x00KBj\x18\x02\x00\x00KCj\x19\x02\x00\x00KDj\x1a\x02\x00\x00KEj\x1b\x02\x00\x00KFj\x1c\x02\x00\x00KGj\x1d\x02\x00\x00KHj\x16\x02\x00\x00KIj\x17\x02\x00\x00KJj\x18\x02\x00\x00KKj\x19\x02\x00\x00KLj\x1a\x02\x00\x00KMj\x1b\x02\x00\x00KNj\x1c\x02\x00\x00KOj\x1d\x02\x00\x00KPj\x16\x02\x00\x00KQj\x17\x02\x00\x00KRj\x18\x02\x00\x00KSj\x19\x02\x00\x00KTj\x1a\x02\x00\x00KUj\x1b\x02\x00\x00KVj\x1c\x02\x00\x00KWj\x1d\x02\x00\x00KXj\x16\x02\x00\x00KYj\x17\x02\x00\x00KZj\x18\x02\x00\x00K[j\x19\x02\x00\x00K\\j\x1a\x02\x00\x00K]j\x1b\x02\x00\x00K^j\x1c\x02\x00\x00K_j\x1d\x02\x00\x00u\x8c\x0fdilution_factor\x94}\x94(K\x00K\x00K\x01K\x00K\x02K\x00K\x03K\x00K\x04K\x00K\x05K\x00K\x06K\x00K\x07K\x00K\x08K(K\tK(K\nK(K\x0bK(K\x0cK(K\rK(K\x0eK(K\x0fK(K\x10KPK\x11KPK\x12KPK\x13KPK\x14KPK\x15KPK\x16KPK\x17KPK\x18K\xa0K\x19K\xa0K\x1aK\xa0K\x1bK\xa0K\x1cK\xa0K\x1dK\xa0K\x1eK\xa0K\x1fK\xa0K M@\x01K!M@\x01K"M@\x01K#M@\x01K$M@\x01K%M@\x01K&M@\x01K\'M@\x01K(M\x80\x02K)M\x80\x02K*M\x80\x02K+M\x80\x02K,M\x80\x02K-M\x80\x02K.M\x80\x02K/M\x80\x02K0M\x00\x05K1M\x00\x05K2M\x00\x05K3M\x00\x05K4M\x00\x05K5M\x00\x05K6M\x00\x05K7M\x00\x05K8M\x00\nK9M\x00\nK:M\x00\nK;M\x00\nK<M\x00\nK=M\x00\nK>M\x00\nK?M\x00\nK@M\x00\x14KAM\x00\x14KBM\x00\x14KCM\x00\x14KDM\x00\x14KEM\x00\x14KFM\x00\x14KGM\x00\x14KHM\x00(KIM\x00(KJM\x00(KKM\x00(KLM\x00(KMM\x00(KNM\x00(KOM\x00(KPM\x00PKQM\x00PKRM\x00PKSM\x00PKTM\x00PKUM\x00PKVM\x00PKWM\x00PKXM\x00\xa0KYM\x00\xa0KZM\x00\xa0K[M\x00\xa0K\\M\x00\xa0K]M\x00\xa0K^M\x00\xa0K_M\x00\xa0u\x8c\treplicate\x94}\x94(K\x00K\x01K\x01K\x02K\x02K\x03K\x03K\x04K\x04K\x05K\x05K\x06K\x06K\x07K\x07K\x08K\x08K\x01K\tK\x01K\nK\x01K\x0bK\x01K\x0cK\x01K\rK\x01K\x0eK\x01K\x0fK\x01K\x10K\x01K\x11K\x01K\x12K\x01K\x13K\x01K\x14K\x01K\x15K\x01K\x16K\x01K\x17K\x01K\x18K\x01K\x19K\x01K\x1aK\x01K\x1bK\x01K\x1cK\x01K\x1dK\x01K\x1eK\x01K\x1fK\x01K K\x01K!K\x01K"K\x01K#K\x01K$K\x01K%K\x01K&K\x01K\'K\x01K(K\x01K)K\x01K*K\x01K+K\x01K,K\x01K-K\x01K.K\x01K/K\x01K0K\x01K1K\x01K2K\x01K3K\x01K4K\x01K5K\x01K6K\x01K7K\x01K8K\x01K9K\x01K:K\x01K;K\x01K<K\x01K=K\x01K>K\x01K?K\x01K@K\x01KAK\x01KBK\x01KCK\x01KDK\x01KEK\x01KFK\x01KGK\x01KHK\x01KIK\x01KJK\x01KKK\x01KLK\x01KMK\x01KNK\x01KOK\x01KPK\x01KQK\x01KRK\x01KSK\x01KTK\x01KUK\x01KVK\x01KWK\x01KXK\x01KYK\x01KZK\x01K[K\x01K\\K\x01K]K\x01K^K\x01K_K\x01u\x8c\x05fastq\x94}\x94(K\x00\x8c|/shared/ngs/illumina/aloes/20241223_LH00740_0033_A22WH77LT3/Unaligned/DRIVE_H1N1_PlatesAtoD/PlateB_1_S1_L002_R1_001.fastq.gz\x94K\x01\x8c|/shared/ngs/illumina/aloes/20241223_LH00740_0033_A22WH77LT3/Unaligned/DRIVE_H1N1_PlatesAtoD/PlateB_2_S2_L002_R1_001.fastq.gz\x94K\x02\x8c|/shared/ngs/illumina/aloes/20241223_LH00740_0033_A22WH77LT3/Unaligned/DRIVE_H1N1_PlatesAtoD/PlateB_3_S3_L002_R1_001.fastq.gz\x94K\x03\x8c|/shared/ngs/illumina/aloes/20241223_LH00740_0033_A22WH77LT3/Unaligned/DRIVE_H1N1_PlatesAtoD/PlateB_4_S4_L002_R1_001.fastq.gz\x94K\x04\x8c|/shared/ngs/illumina/aloes/20241223_LH00740_0033_A22WH77LT3/Unaligned/DRIVE_H1N1_PlatesAtoD/PlateB_5_S5_L002_R1_001.fastq.gz\x94K\x05\x8c|/shared/ngs/illumina/aloes/20241223_LH00740_0033_A22WH77LT3/Unaligned/DRIVE_H1N1_PlatesAtoD/PlateB_6_S6_L002_R1_001.fastq.gz\x94K\x06\x8c|/shared/ngs/illumina/aloes/20241223_LH00740_0033_A22WH77LT3/Unaligned/DRIVE_H1N1_PlatesAtoD/PlateB_7_S7_L002_R1_001.fastq.gz\x94K\x07\x8c|/shared/ngs/illumina/aloes/20241223_LH00740_0033_A22WH77LT3/Unaligned/DRIVE_H1N1_PlatesAtoD/PlateB_8_S8_L002_R1_001.fastq.gz\x94K\x08\x8c|/shared/ngs/illumina/aloes/20241223_LH00740_0033_A22WH77LT3/Unaligned/DRIVE_H1N1_PlatesAtoD/PlateB_9_S9_L002_R1_001.fastq.gz\x94K\t\x8c~/shared/ngs/illumina/aloes/20241223_LH00740_0033_A22WH77LT3/Unaligned/DRIVE_H1N1_PlatesAtoD/PlateB_10_S10_L002_R1_001.fastq.gz\x94K\n\x8c~/shared/ngs/illumina/aloes/20241223_LH00740_0033_A22WH77LT3/Unaligned/DRIVE_H1N1_PlatesAtoD/PlateB_11_S11_L002_R1_001.fastq.gz\x94K\x0b\x8c~/shared/ngs/illumina/aloes/20241223_LH00740_0033_A22WH77LT3/Unaligned/DRIVE_H1N1_PlatesAtoD/PlateB_12_S12_L002_R1_001.fastq.gz\x94K\x0c\x8c~/shared/ngs/illumina/aloes/20241223_LH00740_0033_A22WH77LT3/Unaligned/DRIVE_H1N1_PlatesAtoD/PlateB_13_S13_L002_R1_001.fastq.gz\x94K\r\x8c~/shared/ngs/illumina/aloes/20241223_LH00740_0033_A22WH77LT3/Unaligned/DRIVE_H1N1_PlatesAtoD/PlateB_14_S14_L002_R1_001.fastq.gz\x94K\x0e\x8c~/shared/ngs/illumina/aloes/20241223_LH00740_0033_A22WH77LT3/Unaligned/DRIVE_H1N1_PlatesAtoD/PlateB_15_S15_L002_R1_001.fastq.gz\x94K\x0f\x8c~/shared/ngs/illumina/aloes/20241223_LH00740_0033_A22WH77LT3/Unaligned/DRIVE_H1N1_PlatesAtoD/PlateB_16_S16_L002_R1_001.fastq.gz\x94K\x10\x8c~/shared/ngs/illumina/aloes/20241223_LH00740_0033_A22WH77LT3/Unaligned/DRIVE_H1N1_PlatesAtoD/PlateB_17_S17_L002_R1_001.fastq.gz\x94K\x11\x8c~/shared/ngs/illumina/aloes/20241223_LH00740_0033_A22WH77LT3/Unaligned/DRIVE_H1N1_PlatesAtoD/PlateB_18_S18_L002_R1_001.fastq.gz\x94K\x12\x8c~/shared/ngs/illumina/aloes/20241223_LH00740_0033_A22WH77LT3/Unaligned/DRIVE_H1N1_PlatesAtoD/PlateB_19_S19_L002_R1_001.fastq.gz\x94K\x13\x8c~/shared/ngs/illumina/aloes/20241223_LH00740_0033_A22WH77LT3/Unaligned/DRIVE_H1N1_PlatesAtoD/PlateB_20_S20_L002_R1_001.fastq.gz\x94K\x14\x8c~/shared/ngs/illumina/aloes/20241223_LH00740_0033_A22WH77LT3/Unaligned/DRIVE_H1N1_PlatesAtoD/PlateB_21_S21_L002_R1_001.fastq.gz\x94K\x15\x8c~/shared/ngs/illumina/aloes/20241223_LH00740_0033_A22WH77LT3/Unaligned/DRIVE_H1N1_PlatesAtoD/PlateB_22_S22_L002_R1_001.fastq.gz\x94K\x16\x8c~/shared/ngs/illumina/aloes/20241223_LH00740_0033_A22WH77LT3/Unaligned/DRIVE_H1N1_PlatesAtoD/PlateB_23_S23_L002_R1_001.fastq.gz\x94K\x17\x8c~/shared/ngs/illumina/aloes/20241223_LH00740_0033_A22WH77LT3/Unaligned/DRIVE_H1N1_PlatesAtoD/PlateB_24_S24_L002_R1_001.fastq.gz\x94K\x18\x8c~/shared/ngs/illumina/aloes/20241223_LH00740_0033_A22WH77LT3/Unaligned/DRIVE_H1N1_PlatesAtoD/PlateB_25_S25_L002_R1_001.fastq.gz\x94K\x19\x8c~/shared/ngs/illumina/aloes/20241223_LH00740_0033_A22WH77LT3/Unaligned/DRIVE_H1N1_PlatesAtoD/PlateB_26_S26_L002_R1_001.fastq.gz\x94K\x1a\x8c~/shared/ngs/illumina/aloes/20241223_LH00740_0033_A22WH77LT3/Unaligned/DRIVE_H1N1_PlatesAtoD/PlateB_27_S27_L002_R1_001.fastq.gz\x94K\x1b\x8c~/shared/ngs/illumina/aloes/20241223_LH00740_0033_A22WH77LT3/Unaligned/DRIVE_H1N1_PlatesAtoD/PlateB_28_S28_L002_R1_001.fastq.gz\x94K\x1c\x8c~/shared/ngs/illumina/aloes/20241223_LH00740_0033_A22WH77LT3/Unaligned/DRIVE_H1N1_PlatesAtoD/PlateB_29_S29_L002_R1_001.fastq.gz\x94K\x1d\x8c~/shared/ngs/illumina/aloes/20241223_LH00740_0033_A22WH77LT3/Unaligned/DRIVE_H1N1_PlatesAtoD/PlateB_30_S30_L002_R1_001.fastq.gz\x94K\x1e\x8c~/shared/ngs/illumina/aloes/20241223_LH00740_0033_A22WH77LT3/Unaligned/DRIVE_H1N1_PlatesAtoD/PlateB_31_S31_L002_R1_001.fastq.gz\x94K\x1f\x8c~/shared/ngs/illumina/aloes/20241223_LH00740_0033_A22WH77LT3/Unaligned/DRIVE_H1N1_PlatesAtoD/PlateB_32_S32_L002_R1_001.fastq.gz\x94K \x8c~/shared/ngs/illumina/aloes/20241223_LH00740_0033_A22WH77LT3/Unaligned/DRIVE_H1N1_PlatesAtoD/PlateB_33_S33_L002_R1_001.fastq.gz\x94K!\x8c~/shared/ngs/illumina/aloes/20241223_LH00740_0033_A22WH77LT3/Unaligned/DRIVE_H1N1_PlatesAtoD/PlateB_34_S34_L002_R1_001.fastq.gz\x94K"\x8c~/shared/ngs/illumina/aloes/20241223_LH00740_0033_A22WH77LT3/Unaligned/DRIVE_H1N1_PlatesAtoD/PlateB_35_S35_L002_R1_001.fastq.gz\x94K#\x8c~/shared/ngs/illumina/aloes/20241223_LH00740_0033_A22WH77LT3/Unaligned/DRIVE_H1N1_PlatesAtoD/PlateB_36_S36_L002_R1_001.fastq.gz\x94K$\x8c~/shared/ngs/illumina/aloes/20241223_LH00740_0033_A22WH77LT3/Unaligned/DRIVE_H1N1_PlatesAtoD/PlateB_37_S37_L002_R1_001.fastq.gz\x94K%\x8c~/shared/ngs/illumina/aloes/20241223_LH00740_0033_A22WH77LT3/Unaligned/DRIVE_H1N1_PlatesAtoD/PlateB_38_S38_L002_R1_001.fastq.gz\x94K&\x8c~/shared/ngs/illumina/aloes/20241223_LH00740_0033_A22WH77LT3/Unaligned/DRIVE_H1N1_PlatesAtoD/PlateB_39_S39_L002_R1_001.fastq.gz\x94K\'\x8c~/shared/ngs/illumina/aloes/20241223_LH00740_0033_A22WH77LT3/Unaligned/DRIVE_H1N1_PlatesAtoD/PlateB_40_S40_L002_R1_001.fastq.gz\x94K(\x8c~/shared/ngs/illumina/aloes/20241223_LH00740_0033_A22WH77LT3/Unaligned/DRIVE_H1N1_PlatesAtoD/PlateB_41_S41_L002_R1_001.fastq.gz\x94K)\x8c~/shared/ngs/illumina/aloes/20241223_LH00740_0033_A22WH77LT3/Unaligned/DRIVE_H1N1_PlatesAtoD/PlateB_42_S42_L002_R1_001.fastq.gz\x94K*\x8c~/shared/ngs/illumina/aloes/20241223_LH00740_0033_A22WH77LT3/Unaligned/DRIVE_H1N1_PlatesAtoD/PlateB_43_S43_L002_R1_001.fastq.gz\x94K+\x8c~/shared/ngs/illumina/aloes/20241223_LH00740_0033_A22WH77LT3/Unaligned/DRIVE_H1N1_PlatesAtoD/PlateB_44_S44_L002_R1_001.fastq.gz\x94K,\x8c~/shared/ngs/illumina/aloes/20241223_LH00740_0033_A22WH77LT3/Unaligned/DRIVE_H1N1_PlatesAtoD/PlateB_45_S45_L002_R1_001.fastq.gz\x94K-\x8c~/shared/ngs/illumina/aloes/20241223_LH00740_0033_A22WH77LT3/Unaligned/DRIVE_H1N1_PlatesAtoD/PlateB_46_S46_L002_R1_001.fastq.gz\x94K.\x8c~/shared/ngs/illumina/aloes/20241223_LH00740_0033_A22WH77LT3/Unaligned/DRIVE_H1N1_PlatesAtoD/PlateB_47_S47_L002_R1_001.fastq.gz\x94K/\x8c~/shared/ngs/illumina/aloes/20241223_LH00740_0033_A22WH77LT3/Unaligned/DRIVE_H1N1_PlatesAtoD/PlateB_48_S48_L002_R1_001.fastq.gz\x94K0\x8c~/shared/ngs/illumina/aloes/20241223_LH00740_0033_A22WH77LT3/Unaligned/DRIVE_H1N1_PlatesAtoD/PlateB_49_S49_L002_R1_001.fastq.gz\x94K1\x8c~/shared/ngs/illumina/aloes/20241223_LH00740_0033_A22WH77LT3/Unaligned/DRIVE_H1N1_PlatesAtoD/PlateB_50_S50_L002_R1_001.fastq.gz\x94K2\x8c~/shared/ngs/illumina/aloes/20241223_LH00740_0033_A22WH77LT3/Unaligned/DRIVE_H1N1_PlatesAtoD/PlateB_51_S51_L002_R1_001.fastq.gz\x94K3\x8c~/shared/ngs/illumina/aloes/20241223_LH00740_0033_A22WH77LT3/Unaligned/DRIVE_H1N1_PlatesAtoD/PlateB_52_S52_L002_R1_001.fastq.gz\x94K4\x8c~/shared/ngs/illumina/aloes/20241223_LH00740_0033_A22WH77LT3/Unaligned/DRIVE_H1N1_PlatesAtoD/PlateB_53_S53_L002_R1_001.fastq.gz\x94K5\x8c~/shared/ngs/illumina/aloes/20241223_LH00740_0033_A22WH77LT3/Unaligned/DRIVE_H1N1_PlatesAtoD/PlateB_54_S54_L002_R1_001.fastq.gz\x94K6\x8c~/shared/ngs/illumina/aloes/20241223_LH00740_0033_A22WH77LT3/Unaligned/DRIVE_H1N1_PlatesAtoD/PlateB_55_S55_L002_R1_001.fastq.gz\x94K7\x8c~/shared/ngs/illumina/aloes/20241223_LH00740_0033_A22WH77LT3/Unaligned/DRIVE_H1N1_PlatesAtoD/PlateB_56_S56_L002_R1_001.fastq.gz\x94K8\x8c~/shared/ngs/illumina/aloes/20241223_LH00740_0033_A22WH77LT3/Unaligned/DRIVE_H1N1_PlatesAtoD/PlateB_57_S57_L002_R1_001.fastq.gz\x94K9\x8c~/shared/ngs/illumina/aloes/20241223_LH00740_0033_A22WH77LT3/Unaligned/DRIVE_H1N1_PlatesAtoD/PlateB_58_S58_L002_R1_001.fastq.gz\x94K:\x8c~/shared/ngs/illumina/aloes/20241223_LH00740_0033_A22WH77LT3/Unaligned/DRIVE_H1N1_PlatesAtoD/PlateB_59_S59_L002_R1_001.fastq.gz\x94K;\x8c~/shared/ngs/illumina/aloes/20241223_LH00740_0033_A22WH77LT3/Unaligned/DRIVE_H1N1_PlatesAtoD/PlateB_60_S60_L002_R1_001.fastq.gz\x94K<\x8c~/shared/ngs/illumina/aloes/20241223_LH00740_0033_A22WH77LT3/Unaligned/DRIVE_H1N1_PlatesAtoD/PlateB_61_S61_L002_R1_001.fastq.gz\x94K=\x8c~/shared/ngs/illumina/aloes/20241223_LH00740_0033_A22WH77LT3/Unaligned/DRIVE_H1N1_PlatesAtoD/PlateB_62_S62_L002_R1_001.fastq.gz\x94K>\x8c~/shared/ngs/illumina/aloes/20241223_LH00740_0033_A22WH77LT3/Unaligned/DRIVE_H1N1_PlatesAtoD/PlateB_63_S63_L002_R1_001.fastq.gz\x94K?\x8c~/shared/ngs/illumina/aloes/20241223_LH00740_0033_A22WH77LT3/Unaligned/DRIVE_H1N1_PlatesAtoD/PlateB_64_S64_L002_R1_001.fastq.gz\x94K@\x8c~/shared/ngs/illumina/aloes/20241223_LH00740_0033_A22WH77LT3/Unaligned/DRIVE_H1N1_PlatesAtoD/PlateB_65_S65_L002_R1_001.fastq.gz\x94KA\x8c~/shared/ngs/illumina/aloes/20241223_LH00740_0033_A22WH77LT3/Unaligned/DRIVE_H1N1_PlatesAtoD/PlateB_66_S66_L002_R1_001.fastq.gz\x94KB\x8c~/shared/ngs/illumina/aloes/20241223_LH00740_0033_A22WH77LT3/Unaligned/DRIVE_H1N1_PlatesAtoD/PlateB_67_S67_L002_R1_001.fastq.gz\x94KC\x8c~/shared/ngs/illumina/aloes/20241223_LH00740_0033_A22WH77LT3/Unaligned/DRIVE_H1N1_PlatesAtoD/PlateB_68_S68_L002_R1_001.fastq.gz\x94KD\x8c~/shared/ngs/illumina/aloes/20241223_LH00740_0033_A22WH77LT3/Unaligned/DRIVE_H1N1_PlatesAtoD/PlateB_69_S69_L002_R1_001.fastq.gz\x94KE\x8c~/shared/ngs/illumina/aloes/20241223_LH00740_0033_A22WH77LT3/Unaligned/DRIVE_H1N1_PlatesAtoD/PlateB_70_S70_L002_R1_001.fastq.gz\x94KF\x8c~/shared/ngs/illumina/aloes/20241223_LH00740_0033_A22WH77LT3/Unaligned/DRIVE_H1N1_PlatesAtoD/PlateB_71_S71_L002_R1_001.fastq.gz\x94KG\x8c~/shared/ngs/illumina/aloes/20241223_LH00740_0033_A22WH77LT3/Unaligned/DRIVE_H1N1_PlatesAtoD/PlateB_72_S72_L002_R1_001.fastq.gz\x94KH\x8c~/shared/ngs/illumina/aloes/20241223_LH00740_0033_A22WH77LT3/Unaligned/DRIVE_H1N1_PlatesAtoD/PlateB_73_S73_L002_R1_001.fastq.gz\x94KI\x8c~/shared/ngs/illumina/aloes/20241223_LH00740_0033_A22WH77LT3/Unaligned/DRIVE_H1N1_PlatesAtoD/PlateB_74_S74_L002_R1_001.fastq.gz\x94KJ\x8c~/shared/ngs/illumina/aloes/20241223_LH00740_0033_A22WH77LT3/Unaligned/DRIVE_H1N1_PlatesAtoD/PlateB_75_S75_L002_R1_001.fastq.gz\x94KK\x8c~/shared/ngs/illumina/aloes/20241223_LH00740_0033_A22WH77LT3/Unaligned/DRIVE_H1N1_PlatesAtoD/PlateB_76_S76_L002_R1_001.fastq.gz\x94KL\x8c~/shared/ngs/illumina/aloes/20241223_LH00740_0033_A22WH77LT3/Unaligned/DRIVE_H1N1_PlatesAtoD/PlateB_77_S77_L002_R1_001.fastq.gz\x94KM\x8c~/shared/ngs/illumina/aloes/20241223_LH00740_0033_A22WH77LT3/Unaligned/DRIVE_H1N1_PlatesAtoD/PlateB_78_S78_L002_R1_001.fastq.gz\x94KN\x8c~/shared/ngs/illumina/aloes/20241223_LH00740_0033_A22WH77LT3/Unaligned/DRIVE_H1N1_PlatesAtoD/PlateB_79_S79_L002_R1_001.fastq.gz\x94KO\x8c~/shared/ngs/illumina/aloes/20241223_LH00740_0033_A22WH77LT3/Unaligned/DRIVE_H1N1_PlatesAtoD/PlateB_80_S80_L002_R1_001.fastq.gz\x94KP\x8c~/shared/ngs/illumina/aloes/20241223_LH00740_0033_A22WH77LT3/Unaligned/DRIVE_H1N1_PlatesAtoD/PlateB_81_S81_L002_R1_001.fastq.gz\x94KQ\x8c~/shared/ngs/illumina/aloes/20241223_LH00740_0033_A22WH77LT3/Unaligned/DRIVE_H1N1_PlatesAtoD/PlateB_82_S82_L002_R1_001.fastq.gz\x94KR\x8c~/shared/ngs/illumina/aloes/20241223_LH00740_0033_A22WH77LT3/Unaligned/DRIVE_H1N1_PlatesAtoD/PlateB_83_S83_L002_R1_001.fastq.gz\x94KS\x8c~/shared/ngs/illumina/aloes/20241223_LH00740_0033_A22WH77LT3/Unaligned/DRIVE_H1N1_PlatesAtoD/PlateB_84_S84_L002_R1_001.fastq.gz\x94KT\x8c~/shared/ngs/illumina/aloes/20241223_LH00740_0033_A22WH77LT3/Unaligned/DRIVE_H1N1_PlatesAtoD/PlateB_85_S85_L002_R1_001.fastq.gz\x94KU\x8c~/shared/ngs/illumina/aloes/20241223_LH00740_0033_A22WH77LT3/Unaligned/DRIVE_H1N1_PlatesAtoD/PlateB_86_S86_L002_R1_001.fastq.gz\x94KV\x8c~/shared/ngs/illumina/aloes/20241223_LH00740_0033_A22WH77LT3/Unaligned/DRIVE_H1N1_PlatesAtoD/PlateB_87_S87_L002_R1_001.fastq.gz\x94KW\x8c~/shared/ngs/illumina/aloes/20241223_LH00740_0033_A22WH77LT3/Unaligned/DRIVE_H1N1_PlatesAtoD/PlateB_88_S88_L002_R1_001.fastq.gz\x94KX\x8c~/shared/ngs/illumina/aloes/20241223_LH00740_0033_A22WH77LT3/Unaligned/DRIVE_H1N1_PlatesAtoD/PlateB_89_S89_L002_R1_001.fastq.gz\x94KY\x8c~/shared/ngs/illumina/aloes/20241223_LH00740_0033_A22WH77LT3/Unaligned/DRIVE_H1N1_PlatesAtoD/PlateB_90_S90_L002_R1_001.fastq.gz\x94KZ\x8c~/shared/ngs/illumina/aloes/20241223_LH00740_0033_A22WH77LT3/Unaligned/DRIVE_H1N1_PlatesAtoD/PlateB_91_S91_L002_R1_001.fastq.gz\x94K[\x8c~/shared/ngs/illumina/aloes/20241223_LH00740_0033_A22WH77LT3/Unaligned/DRIVE_H1N1_PlatesAtoD/PlateB_92_S92_L002_R1_001.fastq.gz\x94K\\\x8c~/shared/ngs/illumina/aloes/20241223_LH00740_0033_A22WH77LT3/Unaligned/DRIVE_H1N1_PlatesAtoD/PlateB_93_S93_L002_R1_001.fastq.gz\x94K]\x8c~/shared/ngs/illumina/aloes/20241223_LH00740_0033_A22WH77LT3/Unaligned/DRIVE_H1N1_PlatesAtoD/PlateB_94_S94_L002_R1_001.fastq.gz\x94K^\x8c~/shared/ngs/illumina/aloes/20241223_LH00740_0033_A22WH77LT3/Unaligned/DRIVE_H1N1_PlatesAtoD/PlateB_95_S95_L002_R1_001.fastq.gz\x94K_\x8c~/shared/ngs/illumina/aloes/20241223_LH00740_0033_A22WH77LT3/Unaligned/DRIVE_H1N1_PlatesAtoD/PlateB_96_S96_L002_R1_001.fastq.gz\x94u\x8c\x0fserum_replicate\x94}\x94(K\x00\x8c\x06none-1\x94K\x01\x8c\x06none-2\x94K\x02\x8c\x06none-3\x94K\x03\x8c\x06none-4\x94K\x04\x8c\x06none-5\x94K\x05\x8c\x06none-6\x94K\x06\x8c\x06none-7\x94K\x07\x8c\x06none-8\x94K\x08j\x16\x02\x00\x00K\tj\x17\x02\x00\x00K\nj\x18\x02\x00\x00K\x0bj\x19\x02\x00\x00K\x0cj\x1a\x02\x00\x00K\rj\x1b\x02\x00\x00K\x0ej\x1c\x02\x00\x00K\x0fj\x1d\x02\x00\x00K\x10j\x16\x02\x00\x00K\x11j\x17\x02\x00\x00K\x12j\x18\x02\x00\x00K\x13j\x19\x02\x00\x00K\x14j\x1a\x02\x00\x00K\x15j\x1b\x02\x00\x00K\x16j\x1c\x02\x00\x00K\x17j\x1d\x02\x00\x00K\x18j\x16\x02\x00\x00K\x19j\x17\x02\x00\x00K\x1aj\x18\x02\x00\x00K\x1bj\x19\x02\x00\x00K\x1cj\x1a\x02\x00\x00K\x1dj\x1b\x02\x00\x00K\x1ej\x1c\x02\x00\x00K\x1fj\x1d\x02\x00\x00K j\x16\x02\x00\x00K!j\x17\x02\x00\x00K"j\x18\x02\x00\x00K#j\x19\x02\x00\x00K$j\x1a\x02\x00\x00K%j\x1b\x02\x00\x00K&j\x1c\x02\x00\x00K\'j\x1d\x02\x00\x00K(j\x16\x02\x00\x00K)j\x17\x02\x00\x00K*j\x18\x02\x00\x00K+j\x19\x02\x00\x00K,j\x1a\x02\x00\x00K-j\x1b\x02\x00\x00K.j\x1c\x02\x00\x00K/j\x1d\x02\x00\x00K0j\x16\x02\x00\x00K1j\x17\x02\x00\x00K2j\x18\x02\x00\x00K3j\x19\x02\x00\x00K4j\x1a\x02\x00\x00K5j\x1b\x02\x00\x00K6j\x1c\x02\x00\x00K7j\x1d\x02\x00\x00K8j\x16\x02\x00\x00K9j\x17\x02\x00\x00K:j\x18\x02\x00\x00K;j\x19\x02\x00\x00K<j\x1a\x02\x00\x00K=j\x1b\x02\x00\x00K>j\x1c\x02\x00\x00K?j\x1d\x02\x00\x00K@j\x16\x02\x00\x00KAj\x17\x02\x00\x00KBj\x18\x02\x00\x00KCj\x19\x02\x00\x00KDj\x1a\x02\x00\x00KEj\x1b\x02\x00\x00KFj\x1c\x02\x00\x00KGj\x1d\x02\x00\x00KHj\x16\x02\x00\x00KIj\x17\x02\x00\x00KJj\x18\x02\x00\x00KKj\x19\x02\x00\x00KLj\x1a\x02\x00\x00KMj\x1b\x02\x00\x00KNj\x1c\x02\x00\x00KOj\x1d\x02\x00\x00KPj\x16\x02\x00\x00KQj\x17\x02\x00\x00KRj\x18\x02\x00\x00KSj\x19\x02\x00\x00KTj\x1a\x02\x00\x00KUj\x1b\x02\x00\x00KVj\x1c\x02\x00\x00KWj\x1d\x02\x00\x00KXj\x16\x02\x00\x00KYj\x17\x02\x00\x00KZj\x18\x02\x00\x00K[j\x19\x02\x00\x00K\\j\x1a\x02\x00\x00K]j\x1b\x02\x00\x00K^j\x1c\x02\x00\x00K_j\x1d\x02\x00\x00u\x8c\x0esample_noplate\x94}\x94(K\x00\x8c\x08none-1_0\x94K\x01\x8c\x08none-2_0\x94K\x02\x8c\x08none-3_0\x94K\x03\x8c\x08none-4_0\x94K\x04\x8c\x08none-5_0\x94K\x05\x8c\x08none-6_0\x94K\x06\x8c\x08none-7_0\x94K\x07\x8c\x08none-8_0\x94K\x08\x8c\x17DRIVE_y1985_s042_d30_40\x94K\t\x8c\x16DRIVE_y1985_s042_d0_40\x94K\n\x8c\x17DRIVE_y1980_s002_d30_40\x94K\x0b\x8c\x16DRIVE_y1980_s002_d0_40\x94K\x0c\x8c\x17DRIVE_y1998_s025_d30_40\x94K\r\x8c\x16DRIVE_y1998_s025_d0_40\x94K\x0e\x8c\x17DRIVE_y1999_s013_d30_40\x94K\x0f\x8c\x16DRIVE_y1999_s013_d0_40\x94K\x10\x8c\x17DRIVE_y1985_s042_d30_80\x94K\x11\x8c\x16DRIVE_y1985_s042_d0_80\x94K\x12\x8c\x17DRIVE_y1980_s002_d30_80\x94K\x13\x8c\x16DRIVE_y1980_s002_d0_80\x94K\x14\x8c\x17DRIVE_y1998_s025_d30_80\x94K\x15\x8c\x16DRIVE_y1998_s025_d0_80\x94K\x16\x8c\x17DRIVE_y1999_s013_d30_80\x94K\x17\x8c\x16DRIVE_y1999_s013_d0_80\x94K\x18\x8c\x18DRIVE_y1985_s042_d30_160\x94K\x19\x8c\x17DRIVE_y1985_s042_d0_160\x94K\x1a\x8c\x18DRIVE_y1980_s002_d30_160\x94K\x1b\x8c\x17DRIVE_y1980_s002_d0_160\x94K\x1c\x8c\x18DRIVE_y1998_s025_d30_160\x94K\x1d\x8c\x17DRIVE_y1998_s025_d0_160\x94K\x1e\x8c\x18DRIVE_y1999_s013_d30_160\x94K\x1f\x8c\x17DRIVE_y1999_s013_d0_160\x94K \x8c\x18DRIVE_y1985_s042_d30_320\x94K!\x8c\x17DRIVE_y1985_s042_d0_320\x94K"\x8c\x18DRIVE_y1980_s002_d30_320\x94K#\x8c\x17DRIVE_y1980_s002_d0_320\x94K$\x8c\x18DRIVE_y1998_s025_d30_320\x94K%\x8c\x17DRIVE_y1998_s025_d0_320\x94K&\x8c\x18DRIVE_y1999_s013_d30_320\x94K\'\x8c\x17DRIVE_y1999_s013_d0_320\x94K(\x8c\x18DRIVE_y1985_s042_d30_640\x94K)\x8c\x17DRIVE_y1985_s042_d0_640\x94K*\x8c\x18DRIVE_y1980_s002_d30_640\x94K+\x8c\x17DRIVE_y1980_s002_d0_640\x94K,\x8c\x18DRIVE_y1998_s025_d30_640\x94K-\x8c\x17DRIVE_y1998_s025_d0_640\x94K.\x8c\x18DRIVE_y1999_s013_d30_640\x94K/\x8c\x17DRIVE_y1999_s013_d0_640\x94K0\x8c\x19DRIVE_y1985_s042_d30_1280\x94K1\x8c\x18DRIVE_y1985_s042_d0_1280\x94K2\x8c\x19DRIVE_y1980_s002_d30_1280\x94K3\x8c\x18DRIVE_y1980_s002_d0_1280\x94K4\x8c\x19DRIVE_y1998_s025_d30_1280\x94K5\x8c\x18DRIVE_y1998_s025_d0_1280\x94K6\x8c\x19DRIVE_y1999_s013_d30_1280\x94K7\x8c\x18DRIVE_y1999_s013_d0_1280\x94K8\x8c\x19DRIVE_y1985_s042_d30_2560\x94K9\x8c\x18DRIVE_y1985_s042_d0_2560\x94K:\x8c\x19DRIVE_y1980_s002_d30_2560\x94K;\x8c\x18DRIVE_y1980_s002_d0_2560\x94K<\x8c\x19DRIVE_y1998_s025_d30_2560\x94K=\x8c\x18DRIVE_y1998_s025_d0_2560\x94K>\x8c\x19DRIVE_y1999_s013_d30_2560\x94K?\x8c\x18DRIVE_y1999_s013_d0_2560\x94K@\x8c\x19DRIVE_y1985_s042_d30_5120\x94KA\x8c\x18DRIVE_y1985_s042_d0_5120\x94KB\x8c\x19DRIVE_y1980_s002_d30_5120\x94KC\x8c\x18DRIVE_y1980_s002_d0_5120\x94KD\x8c\x19DRIVE_y1998_s025_d30_5120\x94KE\x8c\x18DRIVE_y1998_s025_d0_5120\x94KF\x8c\x19DRIVE_y1999_s013_d30_5120\x94KG\x8c\x18DRIVE_y1999_s013_d0_5120\x94KH\x8c\x1aDRIVE_y1985_s042_d30_10240\x94KI\x8c\x19DRIVE_y1985_s042_d0_10240\x94KJ\x8c\x1aDRIVE_y1980_s002_d30_10240\x94KK\x8c\x19DRIVE_y1980_s002_d0_10240\x94KL\x8c\x1aDRIVE_y1998_s025_d30_10240\x94KM\x8c\x19DRIVE_y1998_s025_d0_10240\x94KN\x8c\x1aDRIVE_y1999_s013_d30_10240\x94KO\x8c\x19DRIVE_y1999_s013_d0_10240\x94KP\x8c\x1aDRIVE_y1985_s042_d30_20480\x94KQ\x8c\x19DRIVE_y1985_s042_d0_20480\x94KR\x8c\x1aDRIVE_y1980_s002_d30_20480\x94KS\x8c\x19DRIVE_y1980_s002_d0_20480\x94KT\x8c\x1aDRIVE_y1998_s025_d30_20480\x94KU\x8c\x19DRIVE_y1998_s025_d0_20480\x94KV\x8c\x1aDRIVE_y1999_s013_d30_20480\x94KW\x8c\x19DRIVE_y1999_s013_d0_20480\x94KX\x8c\x1aDRIVE_y1985_s042_d30_40960\x94KY\x8c\x19DRIVE_y1985_s042_d0_40960\x94KZ\x8c\x1aDRIVE_y1980_s002_d30_40960\x94K[\x8c\x19DRIVE_y1980_s002_d0_40960\x94K\\\x8c\x1aDRIVE_y1998_s025_d30_40960\x94K]\x8c\x19DRIVE_y1998_s025_d0_40960\x94K^\x8c\x1aDRIVE_y1999_s013_d30_40960\x94K_\x8c\x19DRIVE_y1999_s013_d0_40960\x94u\x8c\x06sample\x94}\x94(K\x00j\x10\x01\x00\x00K\x01j\x11\x01\x00\x00K\x02j\x12\x01\x00\x00K\x03j\x13\x01\x00\x00K\x04j\x14\x01\x00\x00K\x05j\x15\x01\x00\x00K\x06j\x16\x01\x00\x00K\x07j\x17\x01\x00\x00K\x08j\x18\x01\x00\x00K\tj\x19\x01\x00\x00K\nj\x1a\x01\x00\x00K\x0bj\x1b\x01\x00\x00K\x0cj\x1c\x01\x00\x00K\rj\x1d\x01\x00\x00K\x0ej\x1e\x01\x00\x00K\x0fj\x1f\x01\x00\x00K\x10j \x01\x00\x00K\x11j!\x01\x00\x00K\x12j"\x01\x00\x00K\x13j#\x01\x00\x00K\x14j$\x01\x00\x00K\x15j%\x01\x00\x00K\x16j&\x01\x00\x00K\x17j\'\x01\x00\x00K\x18j(\x01\x00\x00K\x19j)\x01\x00\x00K\x1aj*\x01\x00\x00K\x1bj+\x01\x00\x00K\x1cj,\x01\x00\x00K\x1dj-\x01\x00\x00K\x1ej.\x01\x00\x00K\x1fj/\x01\x00\x00K j0\x01\x00\x00K!j1\x01\x00\x00K"j2\x01\x00\x00K#j3\x01\x00\x00K$j4\x01\x00\x00K%j5\x01\x00\x00K&j6\x01\x00\x00K\'j7\x01\x00\x00K(j8\x01\x00\x00K)j9\x01\x00\x00K*j:\x01\x00\x00K+j;\x01\x00\x00K,j<\x01\x00\x00K-j=\x01\x00\x00K.j>\x01\x00\x00K/j?\x01\x00\x00K0j@\x01\x00\x00K1jA\x01\x00\x00K2jB\x01\x00\x00K3jC\x01\x00\x00K4jD\x01\x00\x00K5jE\x01\x00\x00K6jF\x01\x00\x00K7jG\x01\x00\x00K8jH\x01\x00\x00K9jI\x01\x00\x00K:jJ\x01\x00\x00K;jK\x01\x00\x00K<jL\x01\x00\x00K=jM\x01\x00\x00K>jN\x01\x00\x00K?jO\x01\x00\x00K@jP\x01\x00\x00KAjQ\x01\x00\x00KBjR\x01\x00\x00KCjS\x01\x00\x00KDjT\x01\x00\x00KEjU\x01\x00\x00KFjV\x01\x00\x00KGjW\x01\x00\x00KHjX\x01\x00\x00KIjY\x01\x00\x00KJjZ\x01\x00\x00KKj[\x01\x00\x00KLj\\\x01\x00\x00KMj]\x01\x00\x00KNj^\x01\x00\x00KOj_\x01\x00\x00KPj`\x01\x00\x00KQja\x01\x00\x00KRjb\x01\x00\x00KSjc\x01\x00\x00KTjd\x01\x00\x00KUje\x01\x00\x00KVjf\x01\x00\x00KWjg\x01\x00\x00KXjh\x01\x00\x00KYji\x01\x00\x00KZjj\x01\x00\x00K[jk\x01\x00\x00K\\jl\x01\x00\x00K]jm\x01\x00\x00K^jn\x01\x00\x00K_jo\x01\x00\x00u\x8c\x05plate\x94}\x94(K\x00\x8c\x07plate13\x94K\x01j\xf4\x02\x00\x00K\x02j\xf4\x02\x00\x00K\x03j\xf4\x02\x00\x00K\x04j\xf4\x02\x00\x00K\x05j\xf4\x02\x00\x00K\x06j\xf4\x02\x00\x00K\x07j\xf4\x02\x00\x00K\x08j\xf4\x02\x00\x00K\tj\xf4\x02\x00\x00K\nj\xf4\x02\x00\x00K\x0bj\xf4\x02\x00\x00K\x0cj\xf4\x02\x00\x00K\rj\xf4\x02\x00\x00K\x0ej\xf4\x02\x00\x00K\x0fj\xf4\x02\x00\x00K\x10j\xf4\x02\x00\x00K\x11j\xf4\x02\x00\x00K\x12j\xf4\x02\x00\x00K\x13j\xf4\x02\x00\x00K\x14j\xf4\x02\x00\x00K\x15j\xf4\x02\x00\x00K\x16j\xf4\x02\x00\x00K\x17j\xf4\x02\x00\x00K\x18j\xf4\x02\x00\x00K\x19j\xf4\x02\x00\x00K\x1aj\xf4\x02\x00\x00K\x1bj\xf4\x02\x00\x00K\x1cj\xf4\x02\x00\x00K\x1dj\xf4\x02\x00\x00K\x1ej\xf4\x02\x00\x00K\x1fj\xf4\x02\x00\x00K j\xf4\x02\x00\x00K!j\xf4\x02\x00\x00K"j\xf4\x02\x00\x00K#j\xf4\x02\x00\x00K$j\xf4\x02\x00\x00K%j\xf4\x02\x00\x00K&j\xf4\x02\x00\x00K\'j\xf4\x02\x00\x00K(j\xf4\x02\x00\x00K)j\xf4\x02\x00\x00K*j\xf4\x02\x00\x00K+j\xf4\x02\x00\x00K,j\xf4\x02\x00\x00K-j\xf4\x02\x00\x00K.j\xf4\x02\x00\x00K/j\xf4\x02\x00\x00K0j\xf4\x02\x00\x00K1j\xf4\x02\x00\x00K2j\xf4\x02\x00\x00K3j\xf4\x02\x00\x00K4j\xf4\x02\x00\x00K5j\xf4\x02\x00\x00K6j\xf4\x02\x00\x00K7j\xf4\x02\x00\x00K8j\xf4\x02\x00\x00K9j\xf4\x02\x00\x00K:j\xf4\x02\x00\x00K;j\xf4\x02\x00\x00K<j\xf4\x02\x00\x00K=j\xf4\x02\x00\x00K>j\xf4\x02\x00\x00K?j\xf4\x02\x00\x00K@j\xf4\x02\x00\x00KAj\xf4\x02\x00\x00KBj\xf4\x02\x00\x00KCj\xf4\x02\x00\x00KDj\xf4\x02\x00\x00KEj\xf4\x02\x00\x00KFj\xf4\x02\x00\x00KGj\xf4\x02\x00\x00KHj\xf4\x02\x00\x00KIj\xf4\x02\x00\x00KJj\xf4\x02\x00\x00KKj\xf4\x02\x00\x00KLj\xf4\x02\x00\x00KMj\xf4\x02\x00\x00KNj\xf4\x02\x00\x00KOj\xf4\x02\x00\x00KPj\xf4\x02\x00\x00KQj\xf4\x02\x00\x00KRj\xf4\x02\x00\x00KSj\xf4\x02\x00\x00KTj\xf4\x02\x00\x00KUj\xf4\x02\x00\x00KVj\xf4\x02\x00\x00KWj\xf4\x02\x00\x00KXj\xf4\x02\x00\x00KYj\xf4\x02\x00\x00KZj\xf4\x02\x00\x00K[j\xf4\x02\x00\x00K\\j\xf4\x02\x00\x00K]j\xf4\x02\x00\x00K^j\xf4\x02\x00\x00K_j\xf4\x02\x00\x00u\x8c\x0fplate_replicate\x94}\x94(K\x00\x8c\tplate13-1\x94K\x01\x8c\tplate13-2\x94K\x02\x8c\tplate13-3\x94K\x03\x8c\tplate13-4\x94K\x04\x8c\tplate13-5\x94K\x05\x8c\tplate13-6\x94K\x06\x8c\tplate13-7\x94K\x07\x8c\tplate13-8\x94K\x08j\xf4\x02\x00\x00K\tj\xf4\x02\x00\x00K\nj\xf4\x02\x00\x00K\x0bj\xf4\x02\x00\x00K\x0cj\xf4\x02\x00\x00K\rj\xf4\x02\x00\x00K\x0ej\xf4\x02\x00\x00K\x0fj\xf4\x02\x00\x00K\x10j\xf4\x02\x00\x00K\x11j\xf4\x02\x00\x00K\x12j\xf4\x02\x00\x00K\x13j\xf4\x02\x00\x00K\x14j\xf4\x02\x00\x00K\x15j\xf4\x02\x00\x00K\x16j\xf4\x02\x00\x00K\x17j\xf4\x02\x00\x00K\x18j\xf4\x02\x00\x00K\x19j\xf4\x02\x00\x00K\x1aj\xf4\x02\x00\x00K\x1bj\xf4\x02\x00\x00K\x1cj\xf4\x02\x00\x00K\x1dj\xf4\x02\x00\x00K\x1ej\xf4\x02\x00\x00K\x1fj\xf4\x02\x00\x00K j\xf4\x02\x00\x00K!j\xf4\x02\x00\x00K"j\xf4\x02\x00\x00K#j\xf4\x02\x00\x00K$j\xf4\x02\x00\x00K%j\xf4\x02\x00\x00K&j\xf4\x02\x00\x00K\'j\xf4\x02\x00\x00K(j\xf4\x02\x00\x00K)j\xf4\x02\x00\x00K*j\xf4\x02\x00\x00K+j\xf4\x02\x00\x00K,j\xf4\x02\x00\x00K-j\xf4\x02\x00\x00K.j\xf4\x02\x00\x00K/j\xf4\x02\x00\x00K0j\xf4\x02\x00\x00K1j\xf4\x02\x00\x00K2j\xf4\x02\x00\x00K3j\xf4\x02\x00\x00K4j\xf4\x02\x00\x00K5j\xf4\x02\x00\x00K6j\xf4\x02\x00\x00K7j\xf4\x02\x00\x00K8j\xf4\x02\x00\x00K9j\xf4\x02\x00\x00K:j\xf4\x02\x00\x00K;j\xf4\x02\x00\x00K<j\xf4\x02\x00\x00K=j\xf4\x02\x00\x00K>j\xf4\x02\x00\x00K?j\xf4\x02\x00\x00K@j\xf4\x02\x00\x00KAj\xf4\x02\x00\x00KBj\xf4\x02\x00\x00KCj\xf4\x02\x00\x00KDj\xf4\x02\x00\x00KEj\xf4\x02\x00\x00KFj\xf4\x02\x00\x00KGj\xf4\x02\x00\x00KHj\xf4\x02\x00\x00KIj\xf4\x02\x00\x00KJj\xf4\x02\x00\x00KKj\xf4\x02\x00\x00KLj\xf4\x02\x00\x00KMj\xf4\x02\x00\x00KNj\xf4\x02\x00\x00KOj\xf4\x02\x00\x00KPj\xf4\x02\x00\x00KQj\xf4\x02\x00\x00KRj\xf4\x02\x00\x00KSj\xf4\x02\x00\x00KTj\xf4\x02\x00\x00KUj\xf4\x02\x00\x00KVj\xf4\x02\x00\x00KWj\xf4\x02\x00\x00KXj\xf4\x02\x00\x00KYj\xf4\x02\x00\x00KZj\xf4\x02\x00\x00K[j\xf4\x02\x00\x00K\\j\xf4\x02\x00\x00K]j\xf4\x02\x00\x00K^j\xf4\x02\x00\x00K_j\xf4\x02\x00\x00uuue}\x94(h\xcd}\x94(j\xaf\x01\x00\x00K\x00N\x86\x94\x8c\x0cplate_params\x94K\x01N\x86\x94uh\xd7]\x94(h\xd9h\xdaeh\xd9h\xdc)\x81\x94}\x94h\xdfh\xd9sbh\xdah\xdc)\x81\x94}\x94h\xdfh\xdasbj\xaf\x01\x00\x00j\x0f\x01\x00\x00j\x02\x03\x00\x00jp\x01\x00\x00ub\x8c\twildcards\x94h\x06\x8c\tWildcards\x94\x93\x94)\x81\x94\x8c\x07plate13\x94a}\x94(h\xcd}\x94\x8c\x05plate\x94K\x00N\x86\x94sh\xd7]\x94(h\xd9h\xdaeh\xd9h\xdc)\x81\x94}\x94h\xdfh\xd9sbh\xdah\xdc)\x81\x94}\x94h\xdfh\xdasbj\xf2\x02\x00\x00j\r\x03\x00\x00ub\x8c\x07threads\x94K\x01\x8c\tresources\x94h\x06\x8c\tResources\x94\x93\x94)\x81\x94(K\x01K\x01\x8c\x15/loc/scratch/27018360\x94e}\x94(h\xcd}\x94(\x8c\x06_cores\x94K\x00N\x86\x94\x8c\x06_nodes\x94K\x01N\x86\x94\x8c\x06tmpdir\x94K\x02N\x86\x94uh\xd7]\x94(h\xd9h\xdaeh\xd9h\xdc)\x81\x94}\x94h\xdfh\xd9sbh\xdah\xdc)\x81\x94}\x94h\xdfh\xdasbj\x1f\x03\x00\x00K\x01j!\x03\x00\x00K\x01j#\x03\x00\x00j\x1c\x03\x00\x00ub\x8c\x03log\x94h\x06\x8c\x03Log\x94\x93\x94)\x81\x94\x8c,results/plates/plate13/process_plate13.ipynb\x94a}\x94(h\xcd}\x94\x8c\x08notebook\x94K\x00N\x86\x94sh\xd7]\x94(h\xd9h\xdaeh\xd9h\xdc)\x81\x94}\x94h\xdfh\xd9sbh\xdah\xdc)\x81\x94}\x94h\xdfh\xdasbj1\x03\x00\x00j.\x03\x00\x00ub\x8c\x06config\x94}\x94(\x8c\x10seqneut-pipeline\x94\x8c\x10seqneut-pipeline\x94\x8c\x04docs\x94\x8c\x04docs\x94\x8c\x0bdescription\x94X\xdf\x01\x00\x00# Sequencing-based neutralization assays of 2023-2024 Penn Vaccine samples versus H1N1 influenza libraries\nStudy by Loes, Tarabi, et al of samples from the Penn Vaccine cohort and the DRIVE Vaccine Cohort using sequencing-based neutralization assay developed in the Bloom lab.\n\nThe numerical data and computer code are at [https://github.com/jbloomlab/flu_seqneut_pdmH1N1_2023-2024_VaccinatedCohorts](https://github.com/jbloomlab/flu_seqneut_pdmH1N1_2023-2024_VaccinatedCohorts)\n\x94\x8c\x0fviral_libraries\x94}\x94\x8c\x0epdmH1N1Lib2023\x94\x8c*data/viral_libraries/H1N1_2023_library.csv\x94s\x8c\x12neut_standard_sets\x94}\x94\x8c\x08loes2023\x94\x8c3data/neut_standard_sets/loes2023_neut_standards.csv\x94s\x8c\x17viral_strain_plot_order\x94\x8c)data/H1N1library_2023-2024_allStrains.csv\x94\x8c\x1eillumina_barcode_parser_params\x94}\x94(j\xa4\x01\x00\x00j\xa5\x01\x00\x00j\xa6\x01\x00\x00j\xa7\x01\x00\x00j\xa8\x01\x00\x00K\x14j\xa9\x01\x00\x00K\x04j\xaa\x01\x00\x00j\xab\x01\x00\x00u\x8c#default_process_plate_qc_thresholds\x94}\x94(j\x7f\x01\x00\x00M\xf4\x01j\x80\x01\x00\x00G?tz\xe1G\xae\x14{j\x81\x01\x00\x00}\x94(j\x83\x01\x00\x00G?\x04\xf8\xb5\x88\xe3h\xf1j\x84\x01\x00\x00K\x04j\x85\x01\x00\x00K\x02uj\x86\x01\x00\x00}\x94(j\x88\x01\x00\x00G?*6\xe2\xeb\x1cC-j\x89\x01\x00\x00K\x04j\x8a\x01\x00\x00K\x02uj\x8b\x01\x00\x00M\xf4\x01j\x8c\x01\x00\x00K2j\x8d\x01\x00\x00K\x04j\x8e\x01\x00\x00K\x05u\x8c%default_process_plate_curvefit_params\x94}\x94(j\x91\x01\x00\x00K\x01j\x92\x01\x00\x00]\x94(G?\xe3333333K\x01ej\x94\x01\x00\x00K\x00j\x95\x01\x00\x00]\x94(G?\xe9\x99\x99\x99\x99\x99\x9aK\neu\x8c!default_process_plate_curvefit_qc\x94}\x94(j\x99\x01\x00\x00K\x00j\x9a\x01\x00\x00}\x94(j\x9c\x01\x00\x00G?\xe6ffffffj\x9d\x01\x00\x00G?\xc9\x99\x99\x99\x99\x99\x9auj\x9e\x01\x00\x00]\x94j\xa0\x01\x00\x00]\x94u\x8c\x06plates\x94}\x94(\x8c\x06plate1\x94}\x94(\x8c\x05group\x94\x8c\x11PennVaccineCohort\x94\x8c\x04date\x94\x8c\x08datetime\x94\x8c\x04date\x94\x93\x94C\x04\x07\xe8\x06\x0c\x94\x85\x94R\x94\x8c\rviral_library\x94\x8c\x0epdmH1N1Lib2023\x94\x8c\x11neut_standard_set\x94\x8c\x08loes2023\x94\x8c\x0bsamples_csv\x94\x8c\x1fdata/plates/plate5_RT_Penn2.csv\x94\x8c\x0cmanual_drops\x94}\x94\x8c\rqc_thresholds\x94}\x94(j\x7f\x01\x00\x00M\xf4\x01j\x80\x01\x00\x00G?tz\xe1G\xae\x14{j\x81\x01\x00\x00}\x94(j\x83\x01\x00\x00G?\x04\xf8\xb5\x88\xe3h\xf1j\x84\x01\x00\x00K\x04j\x85\x01\x00\x00K\x02uj\x86\x01\x00\x00}\x94(j\x88\x01\x00\x00G?*6\xe2\xeb\x1cC-j\x89\x01\x00\x00K\x04j\x8a\x01\x00\x00K\x02uj\x8b\x01\x00\x00M\xf4\x01j\x8c\x01\x00\x00K2j\x8d\x01\x00\x00K\x04j\x8e\x01\x00\x00K\x05u\x8c\x0fcurvefit_params\x94}\x94(j\x91\x01\x00\x00K\x01j\x92\x01\x00\x00jR\x03\x00\x00j\x94\x01\x00\x00K\x00j\x95\x01\x00\x00jS\x03\x00\x00u\x8c\x0bcurvefit_qc\x94}\x94(j\x99\x01\x00\x00K\x00j\x9a\x01\x00\x00}\x94(\x8c\x06min_R2\x94G?\xe6ffffff\x8c\x08max_RMSD\x94G?\xd0\x00\x00\x00\x00\x00\x00uj\x9e\x01\x00\x00jW\x03\x00\x00j\xa0\x01\x00\x00jX\x03\x00\x00u\x8c\x1eillumina_barcode_parser_params\x94}\x94(\x8c\tupstream2\x94\x8c\x06TGACGC\x94\x8c\x12upstream2_mismatch\x94K\x01uu\x8c\x06plate3\x94}\x94(\x8c\x05group\x94\x8c\x11PennVaccineCohort\x94\x8c\x04date\x94jb\x03\x00\x00C\x04\x07\xe8\x06\x14\x94\x85\x94R\x94\x8c\rviral_library\x94\x8c\x0epdmH1N1Lib2023\x94\x8c\x11neut_standard_set\x94\x8c\x08loes2023\x94\x8c\x0bsamples_csv\x94\x8c\x1fdata/plates/plate7_RT_Penn4.csv\x94\x8c\x0cmanual_drops\x94}\x94\x8c\x10serum_replicates\x94]\x94(\x8c\x14PENN23_y1985_s015_d0\x94\x8c\x15PENN23_y1985_s015_d28\x94es\x8c\rqc_thresholds\x94}\x94(\x8c\x1bavg_barcode_counts_per_well\x94M\x90\x01\x8c\x1fmin_neut_standard_frac_per_well\x94G?tz\xe1G\xae\x14{\x8c"no_serum_per_viral_barcode_filters\x94}\x94(\x8c\x08min_frac\x94G?\x04\xf8\xb5\x88\xe3h\xf1\x8c\x0fmax_fold_change\x94K\x04\x8c\tmax_wells\x94K\x02u\x8c!per_neut_standard_barcode_filters\x94}\x94(\x8c\x08min_frac\x94G?*6\xe2\xeb\x1cC-\x8c\x0fmax_fold_change\x94K\x04\x8c\tmax_wells\x94K\x02u\x8c min_neut_standard_count_per_well\x94M\xf4\x01\x8c)min_no_serum_count_per_viral_barcode_well\x94K2\x8c+max_frac_infectivity_per_viral_barcode_well\x94K\x04\x8c)min_dilutions_per_barcode_serum_replicate\x94K\x05u\x8c\x0fcurvefit_params\x94}\x94(j\x91\x01\x00\x00K\x01j\x92\x01\x00\x00jR\x03\x00\x00j\x94\x01\x00\x00K\x00j\x95\x01\x00\x00jS\x03\x00\x00u\x8c\x0bcurvefit_qc\x94}\x94(j\x99\x01\x00\x00K\x00j\x9a\x01\x00\x00}\x94(j\x9c\x01\x00\x00G?\xe6ffffffj\x9d\x01\x00\x00G?\xc9\x99\x99\x99\x99\x99\x9auj\x9e\x01\x00\x00jW\x03\x00\x00j\xa0\x01\x00\x00jX\x03\x00\x00u\x8c\x1eillumina_barcode_parser_params\x94}\x94(\x8c\tupstream2\x94\x8c\x06ATCGAT\x94\x8c\x12upstream2_mismatch\x94K\x01uu\x8c\x06plate4\x94}\x94(\x8c\x05group\x94\x8c\x11PennVaccineCohort\x94\x8c\x04date\x94jb\x03\x00\x00C\x04\x07\xe8\x06\x14\x94\x85\x94R\x94\x8c\rviral_library\x94\x8c\x0epdmH1N1Lib2023\x94\x8c\x11neut_standard_set\x94\x8c\x08loes2023\x94\x8c\x0bsamples_csv\x94\x8c\x1fdata/plates/plate8_RT_Penn5.csv\x94\x8c\x0cmanual_drops\x94}\x94\x8c\rqc_thresholds\x94}\x94(j\x7f\x01\x00\x00M\xf4\x01j\x80\x01\x00\x00G?tz\xe1G\xae\x14{j\x81\x01\x00\x00}\x94(j\x83\x01\x00\x00G?\x04\xf8\xb5\x88\xe3h\xf1j\x84\x01\x00\x00K\x04j\x85\x01\x00\x00K\x02uj\x86\x01\x00\x00}\x94(j\x88\x01\x00\x00G?*6\xe2\xeb\x1cC-j\x89\x01\x00\x00K\x04j\x8a\x01\x00\x00K\x02uj\x8b\x01\x00\x00M\xf4\x01j\x8c\x01\x00\x00K2j\x8d\x01\x00\x00K\x04j\x8e\x01\x00\x00K\x05u\x8c\x0fcurvefit_params\x94}\x94(j\x91\x01\x00\x00K\x01j\x92\x01\x00\x00jR\x03\x00\x00j\x94\x01\x00\x00K\x00j\x95\x01\x00\x00jS\x03\x00\x00u\x8c\x0bcurvefit_qc\x94}\x94(j\x99\x01\x00\x00K\x00j\x9a\x01\x00\x00}\x94(j\x9c\x01\x00\x00G?\xe6ffffffj\x9d\x01\x00\x00G?\xc9\x99\x99\x99\x99\x99\x9auj\x9e\x01\x00\x00jW\x03\x00\x00j\xa0\x01\x00\x00jX\x03\x00\x00u\x8c\x1eillumina_barcode_parser_params\x94}\x94(\x8c\tupstream2\x94\x8c\x06TGACGC\x94\x8c\x12upstream2_mismatch\x94K\x01uu\x8c\x06plate5\x94}\x94(\x8c\x05group\x94\x8c\x11PennVaccineCohort\x94\x8c\x04date\x94jb\x03\x00\x00C\x04\x07\xe8\x06\x14\x94\x85\x94R\x94\x8c\rviral_library\x94\x8c\x0epdmH1N1Lib2023\x94\x8c\x11neut_standard_set\x94\x8c\x08loes2023\x94\x8c\x0bsamples_csv\x94\x8c\x1fdata/plates/plate9_RT_Penn7.csv\x94\x8c\x0cmanual_drops\x94}\x94\x8c\x10serum_replicates\x94]\x94(\x8c\x14PENN23_y1964_s006_d0\x94\x8c\x15PENN23_y1964_s006_d28\x94es\x8c\rqc_thresholds\x94}\x94(j\x7f\x01\x00\x00M\xf4\x01j\x80\x01\x00\x00G?tz\xe1G\xae\x14{j\x81\x01\x00\x00}\x94(j\x83\x01\x00\x00G?\x04\xf8\xb5\x88\xe3h\xf1j\x84\x01\x00\x00K\x04j\x85\x01\x00\x00K\x02uj\x86\x01\x00\x00}\x94(j\x88\x01\x00\x00G?*6\xe2\xeb\x1cC-j\x89\x01\x00\x00K\x04j\x8a\x01\x00\x00K\x02uj\x8b\x01\x00\x00M\xf4\x01j\x8c\x01\x00\x00K2j\x8d\x01\x00\x00K\x04j\x8e\x01\x00\x00K\x05u\x8c\x0fcurvefit_params\x94}\x94(j\x91\x01\x00\x00K\x01j\x92\x01\x00\x00jR\x03\x00\x00j\x94\x01\x00\x00K\x00j\x95\x01\x00\x00jS\x03\x00\x00u\x8c\x0bcurvefit_qc\x94}\x94(j\x99\x01\x00\x00K\x00j\x9a\x01\x00\x00}\x94(\x8c\x06min_R2\x94G?\xe6ffffff\x8c\x08max_RMSD\x94G?\xd0\x00\x00\x00\x00\x00\x00uj\x9e\x01\x00\x00jW\x03\x00\x00j\xa0\x01\x00\x00jX\x03\x00\x00u\x8c\x1eillumina_barcode_parser_params\x94}\x94(\x8c\tupstream2\x94\x8c\x06GCTACA\x94\x8c\x12upstream2_mismatch\x94K\x01uu\x8c\x06plate6\x94}\x94(\x8c\x05group\x94\x8c\x11PennVaccineCohort\x94\x8c\x04date\x94jb\x03\x00\x00C\x04\x07\xe8\x06\x14\x94\x85\x94R\x94\x8c\rviral_library\x94\x8c\x0epdmH1N1Lib2023\x94\x8c\x11neut_standard_set\x94\x8c\x08loes2023\x94\x8c\x0bsamples_csv\x94\x8c data/plates/plate10_RT_Penn8.csv\x94\x8c\x0cmanual_drops\x94}\x94(\x8c\x10serum_replicates\x94]\x94(\x8c\x14PENN23_y1964_s038_d0\x94\x8c\x15PENN23_y1964_s038_d28\x94e\x8c\x05wells\x94]\x94(\x8c\x03A12\x94\x8c\x03B12\x94\x8c\x03C12\x94\x8c\x03D12\x94\x8c\x03E12\x94\x8c\x03F12\x94\x8c\x03G12\x94\x8c\x03H12\x94eu\x8c\rqc_thresholds\x94}\x94(j\x7f\x01\x00\x00M\xf4\x01j\x80\x01\x00\x00G?tz\xe1G\xae\x14{j\x81\x01\x00\x00}\x94(j\x83\x01\x00\x00G?\x04\xf8\xb5\x88\xe3h\xf1j\x84\x01\x00\x00K\x04j\x85\x01\x00\x00K\x02uj\x86\x01\x00\x00}\x94(j\x88\x01\x00\x00G?*6\xe2\xeb\x1cC-j\x89\x01\x00\x00K\x04j\x8a\x01\x00\x00K\x02uj\x8b\x01\x00\x00M\xf4\x01j\x8c\x01\x00\x00K2j\x8d\x01\x00\x00K\x04j\x8e\x01\x00\x00K\x05u\x8c\x0fcurvefit_params\x94}\x94(j\x91\x01\x00\x00K\x01j\x92\x01\x00\x00jR\x03\x00\x00j\x94\x01\x00\x00K\x00j\x95\x01\x00\x00jS\x03\x00\x00u\x8c\x0bcurvefit_qc\x94}\x94(j\x99\x01\x00\x00K\x00j\x9a\x01\x00\x00}\x94(j\x9c\x01\x00\x00G?\xe6ffffffj\x9d\x01\x00\x00G?\xc9\x99\x99\x99\x99\x99\x9auj\x9e\x01\x00\x00jW\x03\x00\x00j\xa0\x01\x00\x00jX\x03\x00\x00u\x8c\x1eillumina_barcode_parser_params\x94}\x94(\x8c\tupstream2\x94\x8c\x06ATCGAT\x94\x8c\x12upstream2_mismatch\x94K\x01uu\x8c\x06plate7\x94}\x94(\x8c\x05group\x94\x8c\x11PennVaccineCohort\x94\x8c\x04date\x94jb\x03\x00\x00C\x04\x07\xe8\x07\x04\x94\x85\x94R\x94\x8c\rviral_library\x94\x8c\x0epdmH1N1Lib2023\x94\x8c\x11neut_standard_set\x94\x8c\x08loes2023\x94\x8c\x0bsamples_csv\x94\x8c data/plates/plate11_RT_Penn9.csv\x94\x8c\x0cmanual_drops\x94}\x94\x8c\rqc_thresholds\x94}\x94(j\x7f\x01\x00\x00M\xf4\x01j\x80\x01\x00\x00G?tz\xe1G\xae\x14{j\x81\x01\x00\x00}\x94(j\x83\x01\x00\x00G?\x04\xf8\xb5\x88\xe3h\xf1j\x84\x01\x00\x00K\x04j\x85\x01\x00\x00K\x02uj\x86\x01\x00\x00}\x94(j\x88\x01\x00\x00G?*6\xe2\xeb\x1cC-j\x89\x01\x00\x00K\x04j\x8a\x01\x00\x00K\x02uj\x8b\x01\x00\x00M\xf4\x01j\x8c\x01\x00\x00K2j\x8d\x01\x00\x00K\x04j\x8e\x01\x00\x00K\x05u\x8c\x0fcurvefit_params\x94}\x94(j\x91\x01\x00\x00K\x01j\x92\x01\x00\x00jR\x03\x00\x00j\x94\x01\x00\x00K\x00j\x95\x01\x00\x00jS\x03\x00\x00u\x8c\x0bcurvefit_qc\x94}\x94(j\x99\x01\x00\x00K\x00j\x9a\x01\x00\x00}\x94(j\x9c\x01\x00\x00G?\xe6ffffffj\x9d\x01\x00\x00G?\xc9\x99\x99\x99\x99\x99\x9auj\x9e\x01\x00\x00jW\x03\x00\x00j\xa0\x01\x00\x00jX\x03\x00\x00u\x8c\x1eillumina_barcode_parser_params\x94}\x94(\x8c\tupstream2\x94\x8c\x06GCTACA\x94\x8c\x12upstream2_mismatch\x94K\x01uu\x8c\x06plate8\x94}\x94(\x8c\x05group\x94\x8c\x11PennVaccineCohort\x94\x8c\x04date\x94jb\x03\x00\x00C\x04\x07\xe8\x07\x04\x94\x85\x94R\x94\x8c\rviral_library\x94\x8c\x0epdmH1N1Lib2023\x94\x8c\x11neut_standard_set\x94\x8c\x08loes2023\x94\x8c\x0bsamples_csv\x94\x8c!data/plates/plate12_RT_Penn10.csv\x94\x8c\x0cmanual_drops\x94}\x94\x8c\x05wells\x94]\x94\x8c\x03B10\x94as\x8c\rqc_thresholds\x94}\x94(j\x7f\x01\x00\x00M\xf4\x01j\x80\x01\x00\x00G?tz\xe1G\xae\x14{j\x81\x01\x00\x00}\x94(j\x83\x01\x00\x00G?\x04\xf8\xb5\x88\xe3h\xf1j\x84\x01\x00\x00K\x04j\x85\x01\x00\x00K\x02uj\x86\x01\x00\x00}\x94(j\x88\x01\x00\x00G?*6\xe2\xeb\x1cC-j\x89\x01\x00\x00K\x04j\x8a\x01\x00\x00K\x02uj\x8b\x01\x00\x00M\xf4\x01j\x8c\x01\x00\x00K2j\x8d\x01\x00\x00K\x04j\x8e\x01\x00\x00K\x05u\x8c\x0fcurvefit_params\x94}\x94(j\x91\x01\x00\x00K\x01j\x92\x01\x00\x00jR\x03\x00\x00j\x94\x01\x00\x00K\x00j\x95\x01\x00\x00jS\x03\x00\x00u\x8c\x0bcurvefit_qc\x94}\x94(j\x99\x01\x00\x00K\x00j\x9a\x01\x00\x00}\x94(\x8c\x06min_R2\x94G?\xe6ffffff\x8c\x08max_RMSD\x94G?\xd0\x00\x00\x00\x00\x00\x00uj\x9e\x01\x00\x00jW\x03\x00\x00j\xa0\x01\x00\x00jX\x03\x00\x00u\x8c\x1eillumina_barcode_parser_params\x94}\x94(\x8c\tupstream2\x94\x8c\x06ATCGAT\x94\x8c\x12upstream2_mismatch\x94K\x01uu\x8c\x06plate9\x94}\x94(\x8c\x05group\x94\x8c\x11PennVaccineCohort\x94\x8c\x04date\x94jb\x03\x00\x00C\x04\x07\xe8\x07\x04\x94\x85\x94R\x94\x8c\rviral_library\x94\x8c\x0epdmH1N1Lib2023\x94\x8c\x11neut_standard_set\x94\x8c\x08loes2023\x94\x8c\x0bsamples_csv\x94\x8c!data/plates/plate13_RT_Penn11.csv\x94\x8c\x0cmanual_drops\x94}\x94\x8c\rqc_thresholds\x94}\x94(j\x7f\x01\x00\x00M\xf4\x01j\x80\x01\x00\x00G?tz\xe1G\xae\x14{j\x81\x01\x00\x00}\x94(j\x83\x01\x00\x00G?\x04\xf8\xb5\x88\xe3h\xf1j\x84\x01\x00\x00K\x04j\x85\x01\x00\x00K\x02uj\x86\x01\x00\x00}\x94(j\x88\x01\x00\x00G?*6\xe2\xeb\x1cC-j\x89\x01\x00\x00K\x04j\x8a\x01\x00\x00K\x02uj\x8b\x01\x00\x00M\xf4\x01j\x8c\x01\x00\x00K2j\x8d\x01\x00\x00K\x04j\x8e\x01\x00\x00K\x05u\x8c\x0fcurvefit_params\x94}\x94(j\x91\x01\x00\x00K\x01j\x92\x01\x00\x00jR\x03\x00\x00j\x94\x01\x00\x00K\x00j\x95\x01\x00\x00jS\x03\x00\x00u\x8c\x0bcurvefit_qc\x94}\x94(j\x99\x01\x00\x00K\x00j\x9a\x01\x00\x00}\x94(j\x9c\x01\x00\x00G?\xe6ffffffj\x9d\x01\x00\x00G?\xc9\x99\x99\x99\x99\x99\x9auj\x9e\x01\x00\x00jW\x03\x00\x00j\xa0\x01\x00\x00jX\x03\x00\x00u\x8c\x1eillumina_barcode_parser_params\x94}\x94(\x8c\tupstream2\x94\x8c\x06TGACGC\x94\x8c\x12upstream2_mismatch\x94K\x01uu\x8c\x07plate10\x94}\x94(\x8c\x05group\x94\x8c\x11PennVaccineCohort\x94\x8c\x04date\x94jb\x03\x00\x00C\x04\x07\xe8\x07\x04\x94\x85\x94R\x94\x8c\rviral_library\x94\x8c\x0epdmH1N1Lib2023\x94\x8c\x11neut_standard_set\x94\x8c\x08loes2023\x94\x8c\x0bsamples_csv\x94\x8c"data/plates/plate14_RT_Penn1n2.csv\x94\x8c\x0cmanual_drops\x94}\x94\x8c\rqc_thresholds\x94}\x94(j\x7f\x01\x00\x00M\xf4\x01j\x80\x01\x00\x00G?tz\xe1G\xae\x14{j\x81\x01\x00\x00}\x94(j\x83\x01\x00\x00G?\x04\xf8\xb5\x88\xe3h\xf1j\x84\x01\x00\x00K\x04j\x85\x01\x00\x00K\x02uj\x86\x01\x00\x00}\x94(j\x88\x01\x00\x00G?*6\xe2\xeb\x1cC-j\x89\x01\x00\x00K\x04j\x8a\x01\x00\x00K\x02uj\x8b\x01\x00\x00M\xf4\x01j\x8c\x01\x00\x00K2j\x8d\x01\x00\x00K\x04j\x8e\x01\x00\x00K\x05u\x8c\x0fcurvefit_params\x94}\x94(j\x91\x01\x00\x00K\x01j\x92\x01\x00\x00jR\x03\x00\x00j\x94\x01\x00\x00K\x00j\x95\x01\x00\x00jS\x03\x00\x00u\x8c\x0bcurvefit_qc\x94}\x94(j\x99\x01\x00\x00K\x00j\x9a\x01\x00\x00}\x94(j\x9c\x01\x00\x00G?\xe6ffffffj\x9d\x01\x00\x00G?\xc9\x99\x99\x99\x99\x99\x9auj\x9e\x01\x00\x00jW\x03\x00\x00j\xa0\x01\x00\x00jX\x03\x00\x00u\x8c\x1eillumina_barcode_parser_params\x94}\x94(\x8c\tupstream2\x94\x8c\x06CAGTTG\x94\x8c\x12upstream2_mismatch\x94K\x01uu\x8c\x07plate11\x94}\x94(\x8c\x05group\x94\x8c\x11PennVaccineCohort\x94\x8c\x04date\x94jb\x03\x00\x00C\x04\x07\xe8\t\x14\x94\x85\x94R\x94\x8c\rviral_library\x94\x8c\x0epdmH1N1Lib2023\x94\x8c\x11neut_standard_set\x94\x8c\x08loes2023\x94\x8c\x0bsamples_csv\x94\x8c data/plates/plate15_PennRep1.csv\x94\x8c\x0cmanual_drops\x94}\x94\x8c\rqc_thresholds\x94}\x94(j\x7f\x01\x00\x00M\xf4\x01j\x80\x01\x00\x00G?tz\xe1G\xae\x14{j\x81\x01\x00\x00}\x94(j\x83\x01\x00\x00G?\x04\xf8\xb5\x88\xe3h\xf1j\x84\x01\x00\x00K\x04j\x85\x01\x00\x00K\x02uj\x86\x01\x00\x00}\x94(j\x88\x01\x00\x00G?*6\xe2\xeb\x1cC-j\x89\x01\x00\x00K\x04j\x8a\x01\x00\x00K\x02uj\x8b\x01\x00\x00M\xf4\x01j\x8c\x01\x00\x00K2j\x8d\x01\x00\x00K\x04j\x8e\x01\x00\x00K\x05u\x8c\x0fcurvefit_params\x94}\x94(j\x91\x01\x00\x00K\x01j\x92\x01\x00\x00jR\x03\x00\x00j\x94\x01\x00\x00K\x00j\x95\x01\x00\x00jS\x03\x00\x00u\x8c\x0bcurvefit_qc\x94}\x94(j\x99\x01\x00\x00K\x00j\x9a\x01\x00\x00}\x94(j\x9c\x01\x00\x00G?\xe6ffffffj\x9d\x01\x00\x00G?\xc9\x99\x99\x99\x99\x99\x9auj\x9e\x01\x00\x00jW\x03\x00\x00j\xa0\x01\x00\x00jX\x03\x00\x00u\x8c\x1eillumina_barcode_parser_params\x94}\x94(\x8c\tupstream2\x94\x8c\x06GCTACA\x94\x8c\x12upstream2_mismatch\x94K\x01uu\x8c\x07plate12\x94}\x94(\x8c\x05group\x94\x8c\x05DRIVE\x94\x8c\x04date\x94jb\x03\x00\x00C\x04\x07\xe8\x0c\x17\x94\x85\x94R\x94\x8c\rviral_library\x94\x8c\x0epdmH1N1Lib2023\x94\x8c\x11neut_standard_set\x94\x8c\x08loes2023\x94\x8c\x0bsamples_csv\x94\x8c$data/plates/plate20_DRIVE_plateA.csv\x94\x8c\x0cmanual_drops\x94}\x94\x8c\rqc_thresholds\x94}\x94(j\x7f\x01\x00\x00M\xf4\x01j\x80\x01\x00\x00G?tz\xe1G\xae\x14{j\x81\x01\x00\x00}\x94(j\x83\x01\x00\x00G?\x04\xf8\xb5\x88\xe3h\xf1j\x84\x01\x00\x00K\x04j\x85\x01\x00\x00K\x02uj\x86\x01\x00\x00}\x94(j\x88\x01\x00\x00G?*6\xe2\xeb\x1cC-j\x89\x01\x00\x00K\x04j\x8a\x01\x00\x00K\x02uj\x8b\x01\x00\x00M\xf4\x01j\x8c\x01\x00\x00K2j\x8d\x01\x00\x00K\x04j\x8e\x01\x00\x00K\x05u\x8c\x0fcurvefit_params\x94}\x94(j\x91\x01\x00\x00K\x01j\x92\x01\x00\x00jR\x03\x00\x00j\x94\x01\x00\x00K\x00j\x95\x01\x00\x00jS\x03\x00\x00u\x8c\x0bcurvefit_qc\x94}\x94(j\x99\x01\x00\x00K\x00j\x9a\x01\x00\x00}\x94(j\x9c\x01\x00\x00G?\xe6ffffffj\x9d\x01\x00\x00G?\xc9\x99\x99\x99\x99\x99\x9auj\x9e\x01\x00\x00jW\x03\x00\x00j\xa0\x01\x00\x00jX\x03\x00\x00u\x8c\x1eillumina_barcode_parser_params\x94}\x94(\x8c\tupstream2\x94\x8c\x06GCTACA\x94\x8c\x12upstream2_mismatch\x94K\x01uuj\xf4\x02\x00\x00}\x94(jq\x01\x00\x00jr\x01\x00\x00js\x01\x00\x00jb\x03\x00\x00C\x04\x07\xe8\x0c\x17\x94\x85\x94R\x94ju\x01\x00\x00jv\x01\x00\x00jw\x01\x00\x00jx\x01\x00\x00jy\x01\x00\x00jz\x01\x00\x00j{\x01\x00\x00}\x94j}\x01\x00\x00}\x94(j\x7f\x01\x00\x00M\xf4\x01j\x80\x01\x00\x00G?tz\xe1G\xae\x14{j\x81\x01\x00\x00}\x94(j\x83\x01\x00\x00G?\x04\xf8\xb5\x88\xe3h\xf1j\x84\x01\x00\x00K\x04j\x85\x01\x00\x00K\x02uj\x86\x01\x00\x00}\x94(j\x88\x01\x00\x00G?*6\xe2\xeb\x1cC-j\x89\x01\x00\x00K\x04j\x8a\x01\x00\x00K\x02uj\x8b\x01\x00\x00M\xf4\x01j\x8c\x01\x00\x00K2j\x8d\x01\x00\x00K\x04j\x8e\x01\x00\x00K\x05uj\x8f\x01\x00\x00}\x94(j\x91\x01\x00\x00K\x01j\x92\x01\x00\x00jR\x03\x00\x00j\x94\x01\x00\x00K\x00j\x95\x01\x00\x00jS\x03\x00\x00uj\x97\x01\x00\x00}\x94(j\x99\x01\x00\x00K\x00j\x9a\x01\x00\x00}\x94(j\x9c\x01\x00\x00G?\xe6ffffffj\x9d\x01\x00\x00G?\xc9\x99\x99\x99\x99\x99\x9auj\x9e\x01\x00\x00jW\x03\x00\x00j\xa0\x01\x00\x00jX\x03\x00\x00uj\xa2\x01\x00\x00}\x94(j\xac\x01\x00\x00j\xad\x01\x00\x00j\xae\x01\x00\x00K\x01uu\x8c\x07plate14\x94}\x94(\x8c\x05group\x94\x8c\x05DRIVE\x94\x8c\x04date\x94jb\x03\x00\x00C\x04\x07\xe8\x0c\x17\x94\x85\x94R\x94\x8c\rviral_library\x94\x8c\x0epdmH1N1Lib2023\x94\x8c\x11neut_standard_set\x94\x8c\x08loes2023\x94\x8c\x0bsamples_csv\x94\x8c$data/plates/plate20_DRIVE_plateC.csv\x94\x8c\x0cmanual_drops\x94}\x94\x8c\rqc_thresholds\x94}\x94(j\x7f\x01\x00\x00M\xf4\x01j\x80\x01\x00\x00G?tz\xe1G\xae\x14{j\x81\x01\x00\x00}\x94(j\x83\x01\x00\x00G?\x04\xf8\xb5\x88\xe3h\xf1j\x84\x01\x00\x00K\x04j\x85\x01\x00\x00K\x02uj\x86\x01\x00\x00}\x94(j\x88\x01\x00\x00G?*6\xe2\xeb\x1cC-j\x89\x01\x00\x00K\x04j\x8a\x01\x00\x00K\x02uj\x8b\x01\x00\x00M\xf4\x01j\x8c\x01\x00\x00K2j\x8d\x01\x00\x00K\x04j\x8e\x01\x00\x00K\x05u\x8c\x0fcurvefit_params\x94}\x94(j\x91\x01\x00\x00K\x01j\x92\x01\x00\x00jR\x03\x00\x00j\x94\x01\x00\x00K\x00j\x95\x01\x00\x00jS\x03\x00\x00u\x8c\x0bcurvefit_qc\x94}\x94(j\x99\x01\x00\x00K\x00j\x9a\x01\x00\x00}\x94(j\x9c\x01\x00\x00G?\xe6ffffffj\x9d\x01\x00\x00G?\xc9\x99\x99\x99\x99\x99\x9auj\x9e\x01\x00\x00jW\x03\x00\x00j\xa0\x01\x00\x00jX\x03\x00\x00u\x8c\x1eillumina_barcode_parser_params\x94}\x94(\x8c\tupstream2\x94\x8c\x06TGACGC\x94\x8c\x12upstream2_mismatch\x94K\x01uu\x8c\x07plate15\x94}\x94(\x8c\x05group\x94\x8c\x05DRIVE\x94\x8c\x04date\x94jb\x03\x00\x00C\x04\x07\xe8\x0c\x17\x94\x85\x94R\x94\x8c\rviral_library\x94\x8c\x0epdmH1N1Lib2023\x94\x8c\x11neut_standard_set\x94\x8c\x08loes2023\x94\x8c\x0bsamples_csv\x94\x8c$data/plates/plate20_DRIVE_plateD.csv\x94\x8c\x0cmanual_drops\x94}\x94\x8c\rqc_thresholds\x94}\x94(j\x7f\x01\x00\x00M\xf4\x01j\x80\x01\x00\x00G?tz\xe1G\xae\x14{j\x81\x01\x00\x00}\x94(j\x83\x01\x00\x00G?\x04\xf8\xb5\x88\xe3h\xf1j\x84\x01\x00\x00K\x04j\x85\x01\x00\x00K\x02uj\x86\x01\x00\x00}\x94(j\x88\x01\x00\x00G?*6\xe2\xeb\x1cC-j\x89\x01\x00\x00K\x04j\x8a\x01\x00\x00K\x02uj\x8b\x01\x00\x00M\xf4\x01j\x8c\x01\x00\x00K2j\x8d\x01\x00\x00K\x04j\x8e\x01\x00\x00K\x05u\x8c\x0fcurvefit_params\x94}\x94(j\x91\x01\x00\x00K\x01j\x92\x01\x00\x00jR\x03\x00\x00j\x94\x01\x00\x00K\x00j\x95\x01\x00\x00jS\x03\x00\x00u\x8c\x0bcurvefit_qc\x94}\x94(j\x99\x01\x00\x00K\x00j\x9a\x01\x00\x00}\x94(j\x9c\x01\x00\x00G?\xe6ffffffj\x9d\x01\x00\x00G?\xc9\x99\x99\x99\x99\x99\x9auj\x9e\x01\x00\x00jW\x03\x00\x00j\xa0\x01\x00\x00jX\x03\x00\x00u\x8c\x1eillumina_barcode_parser_params\x94}\x94(\x8c\tupstream2\x94\x8c\x06CAGTTG\x94\x8c\x12upstream2_mismatch\x94K\x01uu\x8c\x07plate16\x94}\x94(\x8c\x05group\x94\x8c\x05DRIVE\x94\x8c\x04date\x94jb\x03\x00\x00C\x04\x07\xe8\x01\x1d\x94\x85\x94R\x94\x8c\rviral_library\x94\x8c\x0epdmH1N1Lib2023\x94\x8c\x11neut_standard_set\x94\x8c\x08loes2023\x94\x8c\x0bsamples_csv\x94\x8c$data/plates/plate24_DRIVE_plateE.csv\x94\x8c\x0cmanual_drops\x94}\x94\x8c\rqc_thresholds\x94}\x94(j\x7f\x01\x00\x00M\xf4\x01j\x80\x01\x00\x00G?tz\xe1G\xae\x14{j\x81\x01\x00\x00}\x94(j\x83\x01\x00\x00G?\x04\xf8\xb5\x88\xe3h\xf1j\x84\x01\x00\x00K\x04j\x85\x01\x00\x00K\x02uj\x86\x01\x00\x00}\x94(j\x88\x01\x00\x00G?*6\xe2\xeb\x1cC-j\x89\x01\x00\x00K\x04j\x8a\x01\x00\x00K\x02uj\x8b\x01\x00\x00M\xf4\x01j\x8c\x01\x00\x00K2j\x8d\x01\x00\x00K\x04j\x8e\x01\x00\x00K\x05u\x8c\x0fcurvefit_params\x94}\x94(j\x91\x01\x00\x00K\x01j\x92\x01\x00\x00jR\x03\x00\x00j\x94\x01\x00\x00K\x00j\x95\x01\x00\x00jS\x03\x00\x00u\x8c\x0bcurvefit_qc\x94}\x94(j\x99\x01\x00\x00K\x00j\x9a\x01\x00\x00}\x94(j\x9c\x01\x00\x00G?\xe6ffffffj\x9d\x01\x00\x00G?\xc9\x99\x99\x99\x99\x99\x9auj\x9e\x01\x00\x00jW\x03\x00\x00j\xa0\x01\x00\x00jX\x03\x00\x00u\x8c\x1eillumina_barcode_parser_params\x94}\x94(\x8c\tupstream2\x94\x8c\x06GCTACA\x94\x8c\x12upstream2_mismatch\x94K\x01uu\x8c\x07plate17\x94}\x94(\x8c\x05group\x94\x8c\x05DRIVE\x94\x8c\x04date\x94jb\x03\x00\x00C\x04\x07\xe8\x01\x1d\x94\x85\x94R\x94\x8c\rviral_library\x94\x8c\x0epdmH1N1Lib2023\x94\x8c\x11neut_standard_set\x94\x8c\x08loes2023\x94\x8c\x0bsamples_csv\x94\x8c$data/plates/plate25_DRIVE_plateF.csv\x94\x8c\x0cmanual_drops\x94}\x94\x8c\rqc_thresholds\x94}\x94(j\x7f\x01\x00\x00M\xf4\x01j\x80\x01\x00\x00G?tz\xe1G\xae\x14{j\x81\x01\x00\x00}\x94(j\x83\x01\x00\x00G?\x04\xf8\xb5\x88\xe3h\xf1j\x84\x01\x00\x00K\x04j\x85\x01\x00\x00K\x02uj\x86\x01\x00\x00}\x94(j\x88\x01\x00\x00G?*6\xe2\xeb\x1cC-j\x89\x01\x00\x00K\x04j\x8a\x01\x00\x00K\x02uj\x8b\x01\x00\x00M\xf4\x01j\x8c\x01\x00\x00K2j\x8d\x01\x00\x00K\x04j\x8e\x01\x00\x00K\x05u\x8c\x0fcurvefit_params\x94}\x94(j\x91\x01\x00\x00K\x01j\x92\x01\x00\x00jR\x03\x00\x00j\x94\x01\x00\x00K\x00j\x95\x01\x00\x00jS\x03\x00\x00u\x8c\x0bcurvefit_qc\x94}\x94(j\x99\x01\x00\x00K\x00j\x9a\x01\x00\x00}\x94(j\x9c\x01\x00\x00G?\xe6ffffffj\x9d\x01\x00\x00G?\xc9\x99\x99\x99\x99\x99\x9auj\x9e\x01\x00\x00jW\x03\x00\x00j\xa0\x01\x00\x00jX\x03\x00\x00u\x8c\x1eillumina_barcode_parser_params\x94}\x94(\x8c\tupstream2\x94\x8c\x06ATCGAT\x94\x8c\x12upstream2_mismatch\x94K\x01uu\x8c\x07plate18\x94}\x94(\x8c\x05group\x94\x8c\x05DRIVE\x94\x8c\x04date\x94jb\x03\x00\x00C\x04\x07\xe8\x01\x1d\x94\x85\x94R\x94\x8c\rviral_library\x94\x8c\x0epdmH1N1Lib2023\x94\x8c\x11neut_standard_set\x94\x8c\x08loes2023\x94\x8c\x0bsamples_csv\x94\x8c$data/plates/plate26_DRIVE_plateG.csv\x94\x8c\x0cmanual_drops\x94}\x94\x8c\x08barcodes\x94]\x94\x8c\x10AATCCGAAATTTATTC\x94as\x8c\rqc_thresholds\x94}\x94(j\x7f\x01\x00\x00M\xf4\x01j\x80\x01\x00\x00G?tz\xe1G\xae\x14{j\x81\x01\x00\x00}\x94(j\x83\x01\x00\x00G?\x04\xf8\xb5\x88\xe3h\xf1j\x84\x01\x00\x00K\x04j\x85\x01\x00\x00K\x02uj\x86\x01\x00\x00}\x94(j\x88\x01\x00\x00G?*6\xe2\xeb\x1cC-j\x89\x01\x00\x00K\x04j\x8a\x01\x00\x00K\x02uj\x8b\x01\x00\x00M\xf4\x01j\x8c\x01\x00\x00K2j\x8d\x01\x00\x00K\x04j\x8e\x01\x00\x00K\x05u\x8c\x0fcurvefit_params\x94}\x94(j\x91\x01\x00\x00K\x01j\x92\x01\x00\x00jR\x03\x00\x00j\x94\x01\x00\x00K\x00j\x95\x01\x00\x00jS\x03\x00\x00u\x8c\x0bcurvefit_qc\x94}\x94(j\x99\x01\x00\x00K\x00j\x9a\x01\x00\x00}\x94(j\x9c\x01\x00\x00G?\xe6ffffffj\x9d\x01\x00\x00G?\xc9\x99\x99\x99\x99\x99\x9auj\x9e\x01\x00\x00jW\x03\x00\x00j\xa0\x01\x00\x00jX\x03\x00\x00u\x8c\x1eillumina_barcode_parser_params\x94}\x94(\x8c\tupstream2\x94\x8c\x06TGACGC\x94\x8c\x12upstream2_mismatch\x94K\x01uu\x8c\x07plate19\x94}\x94(\x8c\x05group\x94\x8c\x05DRIVE\x94\x8c\x04date\x94jb\x03\x00\x00C\x04\x07\xe8\x01\x1b\x94\x85\x94R\x94\x8c\rviral_library\x94\x8c\x0epdmH1N1Lib2023\x94\x8c\x11neut_standard_set\x94\x8c\x08loes2023\x94\x8c\x0bsamples_csv\x94\x8c$data/plates/plate27_DRIVE_plateH.csv\x94\x8c\x0cmanual_drops\x94}\x94\x8c\rqc_thresholds\x94}\x94(j\x7f\x01\x00\x00M\xf4\x01j\x80\x01\x00\x00G?tz\xe1G\xae\x14{j\x81\x01\x00\x00}\x94(j\x83\x01\x00\x00G?\x04\xf8\xb5\x88\xe3h\xf1j\x84\x01\x00\x00K\x04j\x85\x01\x00\x00K\x02uj\x86\x01\x00\x00}\x94(j\x88\x01\x00\x00G?*6\xe2\xeb\x1cC-j\x89\x01\x00\x00K\x04j\x8a\x01\x00\x00K\x02uj\x8b\x01\x00\x00M\xf4\x01j\x8c\x01\x00\x00K2j\x8d\x01\x00\x00K\x04j\x8e\x01\x00\x00K\x05u\x8c\x0fcurvefit_params\x94}\x94(j\x91\x01\x00\x00K\x01j\x92\x01\x00\x00jR\x03\x00\x00j\x94\x01\x00\x00K\x00j\x95\x01\x00\x00jS\x03\x00\x00u\x8c\x0bcurvefit_qc\x94}\x94(j\x99\x01\x00\x00K\x00j\x9a\x01\x00\x00}\x94(j\x9c\x01\x00\x00G?\xe6ffffffj\x9d\x01\x00\x00G?\xc9\x99\x99\x99\x99\x99\x9auj\x9e\x01\x00\x00jW\x03\x00\x00j\xa0\x01\x00\x00jX\x03\x00\x00u\x8c\x1eillumina_barcode_parser_params\x94}\x94(\x8c\tupstream2\x94\x8c\x06CAGTTG\x94\x8c\x12upstream2_mismatch\x94K\x01uu\x8c\x07plate20\x94}\x94(\x8c\x05group\x94\x8c\x05DRIVE\x94\x8c\x04date\x94jb\x03\x00\x00C\x04\x07\xe8\x03\x14\x94\x85\x94R\x94\x8c\rviral_library\x94\x8c\x0epdmH1N1Lib2023\x94\x8c\x11neut_standard_set\x94\x8c\x08loes2023\x94\x8c\x0bsamples_csv\x94\x8c$data/plates/plate28_DRIVE_plateI.csv\x94\x8c\x0cmanual_drops\x94}\x94\x8c\rqc_thresholds\x94}\x94(j\x7f\x01\x00\x00M\xf4\x01j\x80\x01\x00\x00G?tz\xe1G\xae\x14{j\x81\x01\x00\x00}\x94(j\x83\x01\x00\x00G?\x04\xf8\xb5\x88\xe3h\xf1j\x84\x01\x00\x00K\x04j\x85\x01\x00\x00K\x02uj\x86\x01\x00\x00}\x94(j\x88\x01\x00\x00G?*6\xe2\xeb\x1cC-j\x89\x01\x00\x00K\x04j\x8a\x01\x00\x00K\x02uj\x8b\x01\x00\x00M\xf4\x01j\x8c\x01\x00\x00K2j\x8d\x01\x00\x00K\x04j\x8e\x01\x00\x00K\x05u\x8c\x0fcurvefit_params\x94}\x94(j\x91\x01\x00\x00K\x01j\x92\x01\x00\x00jR\x03\x00\x00j\x94\x01\x00\x00K\x00j\x95\x01\x00\x00jS\x03\x00\x00u\x8c\x0bcurvefit_qc\x94}\x94(j\x99\x01\x00\x00K\x00j\x9a\x01\x00\x00}\x94(j\x9c\x01\x00\x00G?\xe6ffffffj\x9d\x01\x00\x00G?\xc9\x99\x99\x99\x99\x99\x9auj\x9e\x01\x00\x00jW\x03\x00\x00j\xa0\x01\x00\x00jX\x03\x00\x00u\x8c\x1eillumina_barcode_parser_params\x94}\x94(\x8c\tupstream2\x94\x8c\x06TGACGC\x94\x8c\x12upstream2_mismatch\x94K\x01uu\x8c\x07plate21\x94}\x94(\x8c\x05group\x94\x8c\x11PennVaccineCohort\x94\x8c\x04date\x94jb\x03\x00\x00C\x04\x07\xe8\x03\x14\x94\x85\x94R\x94\x8c\rviral_library\x94\x8c\x0epdmH1N1Lib2023\x94\x8c\x11neut_standard_set\x94\x8c\x08loes2023\x94\x8c\x0bsamples_csv\x94\x8c#data/plates/plate29_Penn_plateI.csv\x94\x8c\x0cmanual_drops\x94}\x94\x8c\rqc_thresholds\x94}\x94(j\x7f\x01\x00\x00M\xf4\x01j\x80\x01\x00\x00G?tz\xe1G\xae\x14{j\x81\x01\x00\x00}\x94(j\x83\x01\x00\x00G?\x04\xf8\xb5\x88\xe3h\xf1j\x84\x01\x00\x00K\x04j\x85\x01\x00\x00K\x02uj\x86\x01\x00\x00}\x94(j\x88\x01\x00\x00G?*6\xe2\xeb\x1cC-j\x89\x01\x00\x00K\x04j\x8a\x01\x00\x00K\x02uj\x8b\x01\x00\x00M\xf4\x01j\x8c\x01\x00\x00K2j\x8d\x01\x00\x00K\x04j\x8e\x01\x00\x00K\x05u\x8c\x0fcurvefit_params\x94}\x94(j\x91\x01\x00\x00K\x01j\x92\x01\x00\x00jR\x03\x00\x00j\x94\x01\x00\x00K\x00j\x95\x01\x00\x00jS\x03\x00\x00u\x8c\x0bcurvefit_qc\x94}\x94(j\x99\x01\x00\x00K\x00j\x9a\x01\x00\x00}\x94(j\x9c\x01\x00\x00G?\xe6ffffffj\x9d\x01\x00\x00G?\xc9\x99\x99\x99\x99\x99\x9auj\x9e\x01\x00\x00jW\x03\x00\x00j\xa0\x01\x00\x00jX\x03\x00\x00u\x8c\x1eillumina_barcode_parser_params\x94}\x94(\x8c\tupstream2\x94\x8c\x06TGACGC\x94\x8c\x12upstream2_mismatch\x94K\x01uu\x8c\x07plate22\x94}\x94(\x8c\x05group\x94\x8c\x05DRIVE\x94\x8c\x04date\x94jb\x03\x00\x00C\x04\x07\xe8\x03\x14\x94\x85\x94R\x94\x8c\rviral_library\x94\x8c\x0epdmH1N1Lib2023\x94\x8c\x11neut_standard_set\x94\x8c\x08loes2023\x94\x8c\x0bsamples_csv\x94\x8c$data/plates/plate30_DRIVE_plateJ.csv\x94\x8c\x0cmanual_drops\x94}\x94\x8c\rqc_thresholds\x94}\x94(j\x7f\x01\x00\x00M\xf4\x01j\x80\x01\x00\x00G?tz\xe1G\xae\x14{j\x81\x01\x00\x00}\x94(j\x83\x01\x00\x00G?\x04\xf8\xb5\x88\xe3h\xf1j\x84\x01\x00\x00K\x04j\x85\x01\x00\x00K\x02uj\x86\x01\x00\x00}\x94(j\x88\x01\x00\x00G?*6\xe2\xeb\x1cC-j\x89\x01\x00\x00K\x04j\x8a\x01\x00\x00K\x02uj\x8b\x01\x00\x00M\xf4\x01j\x8c\x01\x00\x00K2j\x8d\x01\x00\x00K\x04j\x8e\x01\x00\x00K\x05u\x8c\x0fcurvefit_params\x94}\x94(j\x91\x01\x00\x00K\x01j\x92\x01\x00\x00jR\x03\x00\x00j\x94\x01\x00\x00K\x00j\x95\x01\x00\x00jS\x03\x00\x00u\x8c\x0bcurvefit_qc\x94}\x94(j\x99\x01\x00\x00K\x00j\x9a\x01\x00\x00}\x94(j\x9c\x01\x00\x00G?\xe6ffffffj\x9d\x01\x00\x00G?\xc9\x99\x99\x99\x99\x99\x9auj\x9e\x01\x00\x00jW\x03\x00\x00j\xa0\x01\x00\x00jX\x03\x00\x00u\x8c\x1eillumina_barcode_parser_params\x94}\x94(\x8c\tupstream2\x94\x8c\x06CAGTTG\x94\x8c\x12upstream2_mismatch\x94K\x01uuu\x8c\x14miscellaneous_plates\x94}\x94(\x8c\x12plate1_initialpool\x94}\x94(\x8c\x04date\x94jb\x03\x00\x00C\x04\x07\xe8\x01\x13\x94\x85\x94R\x94\x8c\rviral_library\x94\x8c\x0epdmH1N1Lib2023\x94\x8c\x11neut_standard_set\x94\x8c\x08loes2023\x94\x8c\x0bsamples_csv\x94\x8c"data/plates/plate1_initialpool.csv\x94u\x8c\rplate2_repool\x94}\x94(\x8c\x04date\x94jb\x03\x00\x00C\x04\x07\xe8\x01\x1a\x94\x85\x94R\x94\x8c\rviral_library\x94\x8c\x0epdmH1N1Lib2023\x94\x8c\x11neut_standard_set\x94\x8c\x08loes2023\x94\x8c\x0bsamples_csv\x94\x8c&data/plates/plate2_repoolrepassage.csv\x94u\x8c\x0eplate3_MOITest\x94}\x94(\x8c\x04date\x94jb\x03\x00\x00C\x04\x07\xe8\x02\x1d\x94\x85\x94R\x94\x8c\rviral_library\x94\x8c\x0epdmH1N1Lib2023\x94\x8c\x11neut_standard_set\x94\x8c\x08loes2023\x94\x8c\x0bsamples_csv\x94\x8c\x1edata/plates/plate3_MOItest.csv\x94uu\x8c\x16default_serum_titer_as\x94\x8c\x08midpoint\x94\x8c\x1bdefault_serum_qc_thresholds\x94}\x94(\x8c\x0emin_replicates\x94K\x01\x8c\x1bmax_fold_change_from_median\x94K\n\x8c\x11viruses_ignore_qc\x94}\x94u\x8c\x16sera_override_defaults\x94}\x94u\x8c\x04rule\x94\x8c\rprocess_plate\x94\x8c\x0fbench_iteration\x94N\x8c\tscriptdir\x94\x8c~/fh/fast/bloom_j/computational_notebooks/aloes/2025/flu_seqneut_pdmH1N1_2023-2024_VaccinatedCohorts/seqneut-pipeline/notebooks\x94ub.');del script;from snakemake.logging import logger;from snakemake.script import snakemake; logger.printshellcmds = False;import os; os.chdir(r'/fh/fast/bloom_j/computational_notebooks/aloes/2025/flu_seqneut_pdmH1N1_2023-2024_VaccinatedCohorts');
######## snakemake preamble end #########
Process plate counts to get fraction infectivities and fit curves¶
This notebook is designed to be run using snakemake, and analyzes a plate of sequencing-based neutralization assays.
The plots generated by this notebook are interactive, so you can mouseover points for details, use the mouse-scroll to zoom and pan, and use interactive dropdowns at the bottom of the plots.
Setup¶
Import Python modules:
import pickle
import sys
import altair as alt
import matplotlib.pyplot as plt
import neutcurve
import numpy
import pandas as pd
import ruamel.yaml as yaml
_ = alt.data_transformers.disable_max_rows()
Get the variables passed by snakemake:
count_csvs = snakemake.input.count_csvs
fate_csvs = snakemake.input.fate_csvs
viral_library_csv = snakemake.input.viral_library_csv
neut_standard_set_csv = snakemake.input.neut_standard_set_csv
qc_drops_yaml = snakemake.output.qc_drops
frac_infectivity_csv = snakemake.output.frac_infectivity_csv
fits_csv = snakemake.output.fits_csv
fits_pickle = snakemake.output.fits_pickle
samples = snakemake.params.samples
plate = snakemake.wildcards.plate
plate_params = snakemake.params.plate_params
# get thresholds turning lists into tuples as needed
manual_drops = {
filter_type: [tuple(w) if isinstance(w, list) else w for w in filter_drops]
for (filter_type, filter_drops) in plate_params["manual_drops"].items()
}
group = plate_params["group"]
qc_thresholds = plate_params["qc_thresholds"]
curvefit_params = plate_params["curvefit_params"]
curvefit_qc = plate_params["curvefit_qc"]
curvefit_qc["barcode_serum_replicates_ignore_curvefit_qc"] = [
tuple(w) for w in curvefit_qc["barcode_serum_replicates_ignore_curvefit_qc"]
]
print(f"Processing {plate=}")
samples_df = pd.DataFrame(plate_params["samples"])
print(f"\nPlate has {len(samples)} samples (wells)")
assert all(
(len(samples_df) == samples_df[c].nunique())
for c in ["well", "sample", "sample_noplate"]
)
assert len(samples_df) == len(
samples_df.groupby(["serum_replicate", "dilution_factor"])
)
assert len(samples) == len(count_csvs) == len(fate_csvs) == len(samples_df)
for d, key, title in [
(manual_drops, "manual_drops", "Data manually specified to drop:"),
(qc_thresholds, "qc_thresholds", "QC thresholds applied to data:"),
(curvefit_params, "curvefit_params", "Curve-fitting parameters:"),
(curvefit_qc, "curvefit_qc", "Curve-fitting QC:"),
]:
print(f"\n{title}")
yaml.YAML(typ="rt").dump({key: d}, stream=sys.stdout)
Processing plate='plate13'
Plate has 96 samples (wells)
Data manually specified to drop:
manual_drops: {}
QC thresholds applied to data:
qc_thresholds:
avg_barcode_counts_per_well: 500
min_neut_standard_frac_per_well: 0.005
no_serum_per_viral_barcode_filters:
min_frac: 4e-05
max_fold_change: 4
max_wells: 2
per_neut_standard_barcode_filters:
min_frac: 0.0002
max_fold_change: 4
max_wells: 2
min_neut_standard_count_per_well: 500
min_no_serum_count_per_viral_barcode_well: 50
max_frac_infectivity_per_viral_barcode_well: 4
min_dilutions_per_barcode_serum_replicate: 5
Curve-fitting parameters: curvefit_params: frac_infectivity_ceiling: 1 fixtop: - 0.6 - 1 fixbottom: 0 fixslope: - 0.8 - 10
Curve-fitting QC:
curvefit_qc:
max_frac_infectivity_at_least: 0
goodness_of_fit:
min_R2: 0.7
max_RMSD: 0.2
serum_replicates_ignore_curvefit_qc: []
barcode_serum_replicates_ignore_curvefit_qc: []
Set up dictionary to keep track of wells, barcodes, well-barcodes, and serum-replicates that are dropped:
qc_drops = {
"wells": {},
"barcodes": {},
"barcode_wells": {},
"barcode_serum_replicates": {},
"serum_replicates": {},
}
assert set(manual_drops).issubset(
qc_drops
), f"{manual_drops.keys()=}, {qc_drops.keys()}"
Statistics on barcode-parsing for each sample¶
Make interactive chart of the "fates" of the sequencing reads parsed for each sample on the plate.
If most sequencing reads are not "valid barcodes", this could potentially indicate some problem in the sequencing or barcode set you are parsing.
Potential fates are:
- valid barcode: barcode that matches a known virus or neutralization standard, we hope most reads are this.
- invalid barcode: a barcode with proper flanking sequences, but does not match a known virus or neutralization standard. If you have a lot of reads of this type, it is probably a good idea to look at the invalid barcode CSVs (in the
./results/barcode_invalid/subdirectory created by the pipeline) to see what these invalid barcodes are. - unparseable barcode: could not parse a barcode from this read as there was not a sequence of the correct length with the appropriate flanking sequence.
- invalid outer flank: if using an outer upstream or downstream region (
upstream2ordownstream2for the illuminabarcodeparser), reads that are otherwise valid except for this outer flank. Typically you would be usingupstream2if you have a plate index embedded in your primer, and reads with this classification correspond to a different index than the one for this plate. - low quality barcode: low-quality or
Nnucleotides in barcode, could indicate problem with sequencing. - failed chastity filter: reads that failed the Illumina chastity filter, if these are reported in the FASTQ (they may not be).
Also, if the number of reads per sample is very uneven, that could indicate that you did not do a good job of balancing the different samples in the Illumina sequencing.
fates = (
pd.concat([pd.read_csv(f).assign(sample=s) for f, s in zip(fate_csvs, samples)])
.merge(samples_df, validate="many_to_one", on="sample")
.assign(
fate_counts=lambda x: x.groupby("fate")["count"].transform("sum"),
sample_well=lambda x: x["sample_noplate"] + " (" + x["well"] + ")",
)
.query("fate_counts > 0")[ # only keep fates with at least one count
["fate", "count", "well", "serum_replicate", "sample_well", "dilution_factor"]
]
)
assert len(fates) == len(fates.drop_duplicates())
serum_replicates = sorted(fates["serum_replicate"].unique())
sample_wells = list(
fates.sort_values(["serum_replicate", "dilution_factor"])["sample_well"]
)
serum_selection = alt.selection_point(
fields=["serum_replicate"],
bind=alt.binding_select(
options=[None] + serum_replicates,
labels=["all"] + serum_replicates,
name="serum",
),
)
fates_chart = (
alt.Chart(fates)
.add_params(serum_selection)
.transform_filter(serum_selection)
.encode(
alt.X("count", scale=alt.Scale(nice=False, padding=3)),
alt.Y(
"sample_well",
title=None,
sort=sample_wells,
),
alt.Color("fate", sort=sorted(fates["fate"].unique(), reverse=True)),
alt.Order("fate", sort="descending"),
tooltip=fates.columns.tolist(),
)
.mark_bar(height={"band": 0.85})
.properties(
height=alt.Step(10),
width=200,
title=f"Barcode parsing for {plate}",
)
.configure_axis(grid=False)
)
fates_chart
Read barcode counts and apply manually specified drops¶
Read the counts per barcode:
# get barcode counts
counts = (
pd.concat([pd.read_csv(c).assign(sample=s) for c, s in zip(count_csvs, samples)])
.merge(samples_df, validate="many_to_one", on="sample")
.drop(columns=["replicate", "plate", "fastq"])
.assign(sample_well=lambda x: x["sample_noplate"] + " (" + x["well"] + ")")
)
# classify barcodes as viral or neut standard
barcode_class = pd.concat(
[
pd.read_csv(viral_library_csv)[["barcode", "strain"]].assign(
neut_standard=False,
),
pd.read_csv(neut_standard_set_csv)[["barcode"]].assign(
neut_standard=True,
strain=pd.NA,
),
],
ignore_index=True,
)
# merge counts and classification of barcodes
assert set(counts["barcode"]) == set(barcode_class["barcode"])
counts = counts.merge(barcode_class, on="barcode", validate="many_to_one")
assert set(sample_wells) == set(counts["sample_well"])
assert set(serum_replicates) == set(counts["serum_replicate"])
Apply any manually specified data drops:
for filter_type, filter_drops in manual_drops.items():
print(f"\nDropping {len(filter_drops)} {filter_type} specified in manual_drops")
assert filter_type in qc_drops
qc_drops[filter_type].update(
{w: "manual_drop" for w in filter_drops if not isinstance(w, list)}
)
if filter_type == "barcode_wells":
counts = counts[
~counts.assign(
barcode_well=lambda x: x.apply(
lambda r: (r["barcode"], r["well"]), axis=1
)
)["barcode_well"].isin(qc_drops[filter_type])
]
elif filter_type == "barcode_serum_replicates":
counts = counts[
~counts.assign(
barcode_serum_replicate=lambda x: x.apply(
lambda r: (r["barcode"], r["serum_replicate"]), axis=1
)
)["barcode_serum_replicate"].isin(qc_drops[filter_type])
]
elif filter_type == "wells":
counts = counts[~counts["well"].isin(qc_drops[filter_type])]
elif filter_type == "barcodes":
counts = counts[~counts["barcode"].isin(qc_drops[filter_type])]
elif filter_type == "serum_replicates":
counts = counts[~counts["serum_replicate"].isin(qc_drops[filter_type])]
elif filter_type == "barcode_serum_replicates":
counts = counts[~counts["barcode_serum_replicate"].isin(qc_drops[filter_type])]
else:
assert filter_type in set(counts.columns)
counts = counts[~counts[filter_type].isin(qc_drops[filter_type])]
Average counts per barcode in each well¶
Plot average counts per barcode. If a sample has inadequate barcode counts, it may not have good enough statistics for accurate analysis, and a QC-threshold is applied:
avg_barcode_counts = (
counts.groupby(
["well", "serum_replicate", "sample_well"],
dropna=False,
as_index=False,
)
.aggregate(avg_count=pd.NamedAgg("count", "mean"))
.assign(
fails_qc=lambda x: (
x["avg_count"] < qc_thresholds["avg_barcode_counts_per_well"]
),
)
)
avg_barcode_counts_chart = (
alt.Chart(avg_barcode_counts)
.add_params(serum_selection)
.transform_filter(serum_selection)
.encode(
alt.X(
"avg_count",
title="average barcode counts per well",
scale=alt.Scale(nice=False, padding=3),
),
alt.Y("sample_well", sort=sample_wells),
alt.Color(
"fails_qc",
title=f"fails {qc_thresholds['avg_barcode_counts_per_well']=}",
legend=alt.Legend(titleLimit=500),
),
tooltip=[
alt.Tooltip(c, format=".3g") if avg_barcode_counts[c].dtype == float else c
for c in avg_barcode_counts.columns
],
)
.mark_bar(height={"band": 0.85})
.properties(
height=alt.Step(10),
width=250,
title=f"Average barcode counts per well for {plate}",
)
.configure_axis(grid=False)
)
display(avg_barcode_counts_chart)
# drop wells failing QC
avg_barcode_counts_per_well_drops = list(avg_barcode_counts.query("fails_qc")["well"])
print(
f"\nDropping {len(avg_barcode_counts_per_well_drops)} wells for failing "
f"{qc_thresholds['avg_barcode_counts_per_well']=}: "
+ str(avg_barcode_counts_per_well_drops)
)
qc_drops["wells"].update(
{w: "avg_barcode_counts_per_well" for w in avg_barcode_counts_per_well_drops}
)
counts = counts[~counts["well"].isin(qc_drops["wells"])]
Dropping 0 wells for failing qc_thresholds['avg_barcode_counts_per_well']=500: []
Fraction of counts from neutralization standard¶
Determine the fraction of counts from the neutralization standard in each sample, and make sure this fraction passess the QC threshold.
neut_standard_fracs = (
counts.assign(
neut_standard_count=lambda x: x["count"] * x["neut_standard"].astype(int)
)
.groupby(
["well", "serum_replicate", "sample_well"],
dropna=False,
as_index=False,
)
.aggregate(
total_count=pd.NamedAgg("count", "sum"),
neut_standard_count=pd.NamedAgg("neut_standard_count", "sum"),
)
.assign(
neut_standard_frac=lambda x: x["neut_standard_count"] / x["total_count"],
fails_qc=lambda x: (
x["neut_standard_frac"] < qc_thresholds["min_neut_standard_frac_per_well"]
),
)
)
neut_standard_fracs_chart = (
alt.Chart(neut_standard_fracs)
.add_params(serum_selection)
.transform_filter(serum_selection)
.encode(
alt.X(
"neut_standard_frac",
title="frac counts from neutralization standard per well",
scale=alt.Scale(nice=False, padding=3),
),
alt.Y("sample_well", sort=sample_wells),
alt.Color(
"fails_qc",
title=f"fails {qc_thresholds['min_neut_standard_frac_per_well']=}",
legend=alt.Legend(titleLimit=500),
),
tooltip=[
alt.Tooltip(c, format=".3g") if neut_standard_fracs[c].dtype == float else c
for c in neut_standard_fracs.columns
],
)
.mark_bar(height={"band": 0.85})
.properties(
height=alt.Step(10),
width=250,
title=f"Neutralization-standard fracs per well for {plate}",
)
.configure_axis(grid=False)
.configure_legend(titleLimit=1000)
)
display(neut_standard_fracs_chart)
# drop wells failing QC
min_neut_standard_frac_per_well_drops = list(
neut_standard_fracs.query("fails_qc")["well"]
)
print(
f"\nDropping {len(min_neut_standard_frac_per_well_drops)} wells for failing "
f"{qc_thresholds['min_neut_standard_frac_per_well']=}: "
+ str(min_neut_standard_frac_per_well_drops)
)
qc_drops["wells"].update(
{
w: "min_neut_standard_frac_per_well"
for w in min_neut_standard_frac_per_well_drops
}
)
counts = counts[~counts["well"].isin(qc_drops["wells"])]
Dropping 0 wells for failing qc_thresholds['min_neut_standard_frac_per_well']=0.005: []
Consistency and minimum fractions for barcodes¶
We examine the fraction of counts attributable to each barcode. We do this splitting the data two ways:
Looking at all viral (but not neut-standard) barcodes only for the no-serum samples (wells).
Looking at just the neut-standard barcodes for all samples (wells).
The reasons is that if the experiment is set up perfectly, these fractions should be the same across all samples for each barcode. (We do not expect viral barcodes to have consistent fractions across no-serum samples as they will be neutralized differently depending on strain).
We plot these fractions in interactive plots (you can mouseover points and zoom) so you can identify barcodes that fail the expected consistency QC thresholds.
We also make sure the barcodes meet specified QC minimum thresholds for all samples, and flag any that do not.
barcode_selection = alt.selection_point(fields=["barcode"], on="mouseover", empty=False)
# look at all samples for neut standard barcodes, or no-serum samples for all barcodes
for is_neut_standard, df in counts.groupby("neut_standard"):
if is_neut_standard:
print(
f"\n\n{'=' * 89}\nAnalyzing neut-standard barcodes from all samples (wells)"
)
qc_name = "per_neut_standard_barcode_filters"
else:
print(f"\n\n{'=' * 89}\nAnalyzing all barcodes from no-serum samples (wells)")
qc_name = "no_serum_per_viral_barcode_filters"
df = df.query("serum == 'none'")
df = df.assign(
sample_counts=lambda x: x.groupby("sample")["count"].transform("sum"),
count_frac=lambda x: x["count"] / x["sample_counts"],
median_count_frac=lambda x: x.groupby("barcode")["count_frac"].transform(
"median"
),
fold_change_from_median=lambda x: numpy.where(
x["count_frac"] > x["median_count_frac"],
x["count_frac"] / x["median_count_frac"],
x["median_count_frac"] / x["count_frac"],
),
)[
[
"barcode",
"count",
"well",
"sample_well",
"count_frac",
"median_count_frac",
"fold_change_from_median",
]
+ ([] if is_neut_standard else ["strain"])
]
# barcode fails QC if fails in sufficient wells
qc = qc_thresholds[qc_name]
print(f"Apply QC {qc_name}: {qc}\n")
fails_qc = (
df.assign(
fails_qc=lambda x: ~(
(x["count_frac"] >= qc["min_frac"])
& (x["fold_change_from_median"] <= qc["max_fold_change"])
),
)
.groupby("barcode", as_index=False)
.aggregate(n_wells_fail_qc=pd.NamedAgg("fails_qc", "sum"))
.assign(fails_qc=lambda x: x["n_wells_fail_qc"] >= qc["max_wells"])[
["barcode", "fails_qc"]
]
)
df = df.merge(fails_qc, on="barcode", validate="many_to_one")
# make chart
evenness_chart = (
alt.Chart(df)
.add_params(barcode_selection)
.encode(
alt.X(
"count_frac",
title=(
"barcode's fraction of neut standard counts"
if is_neut_standard
else "barcode's fraction of non-neut standard counts"
),
scale=alt.Scale(nice=False, padding=5),
),
alt.Y("sample_well", sort=sample_wells),
alt.Fill(
"fails_qc",
title=f"fails {qc_name}",
legend=alt.Legend(titleLimit=500),
),
strokeWidth=alt.condition(barcode_selection, alt.value(2), alt.value(0)),
size=alt.condition(barcode_selection, alt.value(60), alt.value(35)),
tooltip=[
alt.Tooltip(c, format=".2g") if df[c].dtype == float else c
for c in df.columns
],
)
.mark_circle(fillOpacity=0.45, stroke="black", strokeOpacity=1)
.properties(
height=alt.Step(10),
width=300,
title=alt.TitleParams(
(
f"{plate} all samples, neut-standard barcodes"
if is_neut_standard
else f"{plate} no-serum samples, all barcodes"
),
subtitle="x-axis is zoomable (use mouse scroll/pan)",
),
)
.configure_axis(grid=False)
.configure_legend(titleLimit=1000)
.interactive()
)
display(evenness_chart)
# drop barcodes failing QC
barcode_drops = list(fails_qc.query("fails_qc")["barcode"])
print(
f"\nDropping {len(barcode_drops)} barcodes for failing {qc=}: {barcode_drops}"
)
qc_drops["barcodes"].update(
{bc: "min_neut_standard_frac_per_well" for bc in barcode_drops}
)
counts = counts[~counts["barcode"].isin(qc_drops["barcodes"])]
=========================================================================================
Analyzing all barcodes from no-serum samples (wells)
Apply QC no_serum_per_viral_barcode_filters: {'min_frac': 4e-05, 'max_fold_change': 4, 'max_wells': 2}
Dropping 6 barcodes for failing qc={'min_frac': 4e-05, 'max_fold_change': 4, 'max_wells': 2}: ['AAAATCATTCGACTCT', 'AATCCGAAATTTATTC', 'CCAGGAACAATATATC', 'CCCACCCCTGCCTCCC', 'GAGCAGTATCTGGTTA', 'TTGAAAGCCACAACAC']
=========================================================================================
Analyzing neut-standard barcodes from all samples (wells)
Apply QC per_neut_standard_barcode_filters: {'min_frac': 0.0002, 'max_fold_change': 4, 'max_wells': 2}
Dropping 0 barcodes for failing qc={'min_frac': 0.0002, 'max_fold_change': 4, 'max_wells': 2}: []
Compute fraction infectivity¶
The fraction infectivity for viral barcode $v_b$ in sample $s$ is computed as: $$ F_{v_b,s} = \frac{c_{v_b,s} / \left(\sum_{n_b} c_{n_b,s}\right)}{{\rm median}_{s_0}\left[ c_{v_b,s_0} / \left(\sum_{n_b} c_{n_b,s_0}\right)\right]} $$ where
- $c_{v_b,s}$ is the counts of viral barcode $v_b$ in sample $s$.
- $\sum_{n_b} c_{n_b,s}$ is the sum of the counts for all neutralization standard barcodes $n_b$ for sample $s$.
- $c_{v_b,s_0}$ is the counts of viral barcode $v_b$ in no-serum sample $s_0$.
- $\sum_{n_b} c_{n_b,s_0}$ is the sum of the counts for all neutralization standard barcodes $n_b$ for no-serum sample $s_0$.
- ${\rm median}_{s_0}\left[ c_{v_b,s_0} / \left(\sum_{n_b} c_{n_b,s_0}\right)\right]$ is the median taken across all no-serum samples of the counts of viral barcode $v_b$ versus the total counts for all neutralization standard barcodes.
First, compute the total neutralization-standard counts for each sample (well). Plot these, and drop any wells that do not meet the QC threshold.
neut_standard_counts = (
counts.query("neut_standard")
.groupby(
["well", "serum_replicate", "sample_well", "dilution_factor"],
dropna=False,
as_index=False,
)
.aggregate(neut_standard_count=pd.NamedAgg("count", "sum"))
.assign(
fails_qc=lambda x: (
x["neut_standard_count"] < qc_thresholds["min_neut_standard_count_per_well"]
),
)
)
neut_standard_counts_chart = (
alt.Chart(neut_standard_counts)
.add_params(serum_selection)
.transform_filter(serum_selection)
.encode(
alt.X(
"neut_standard_count",
title="counts from neutralization standard",
scale=alt.Scale(nice=False, padding=3),
),
alt.Y("sample_well", sort=sample_wells),
alt.Color(
"fails_qc",
title=f"fails {qc_thresholds['min_neut_standard_count_per_well']=}",
legend=alt.Legend(titleLimit=500),
),
tooltip=[
(
alt.Tooltip(c, format=".3g")
if neut_standard_counts[c].dtype == float
else c
)
for c in neut_standard_counts.columns
],
)
.mark_bar(height={"band": 0.85})
.properties(
height=alt.Step(10),
width=250,
title=f"Neutralization-standard counts for {plate}",
)
.configure_axis(grid=False)
.configure_legend(titleLimit=1000)
)
display(neut_standard_counts_chart)
# drop wells failing QC
min_neut_standard_count_per_well_drops = list(
neut_standard_counts.query("fails_qc")["well"]
)
print(
f"\nDropping {len(min_neut_standard_count_per_well_drops)} wells for failing "
f"{qc_thresholds['min_neut_standard_count_per_well']=}: "
+ str(min_neut_standard_count_per_well_drops)
)
qc_drops["wells"].update(
{
w: "min_neut_standard_count_per_well"
for w in min_neut_standard_count_per_well_drops
}
)
neut_standard_counts = neut_standard_counts[
~neut_standard_counts["well"].isin(qc_drops["wells"])
]
counts = counts[~counts["well"].isin(qc_drops["wells"])]
Dropping 0 wells for failing qc_thresholds['min_neut_standard_count_per_well']=500: []
Compute and plot the no-serum sample viral barcode counts and check if they pass the QC filters.
no_serum_counts = (
counts.query("serum == 'none'")
.query("not neut_standard")
.merge(neut_standard_counts, validate="many_to_one")[
["barcode", "strain", "well", "sample_well", "count", "neut_standard_count"]
]
.assign(
fails_qc=lambda x: (
x["count"] <= qc_thresholds["min_no_serum_count_per_viral_barcode_well"]
),
)
)
strains = sorted(no_serum_counts["strain"].unique())
strain_selection_dropdown = alt.selection_point(
fields=["strain"],
bind=alt.binding_select(
options=[None] + strains,
labels=["all"] + strains,
name="virus strain",
),
)
# make chart
no_serum_counts_chart = (
alt.Chart(no_serum_counts)
.add_params(barcode_selection, strain_selection_dropdown)
.transform_filter(strain_selection_dropdown)
.encode(
alt.X(
"count", title="viral barcode count", scale=alt.Scale(nice=False, padding=5)
),
alt.Y("sample_well", sort=sample_wells),
alt.Fill(
"fails_qc",
title=f"fails {qc_thresholds['min_no_serum_count_per_viral_barcode_well']=}",
legend=alt.Legend(titleLimit=500),
),
strokeWidth=alt.condition(barcode_selection, alt.value(2), alt.value(0)),
size=alt.condition(barcode_selection, alt.value(60), alt.value(35)),
tooltip=no_serum_counts.columns.tolist(),
)
.mark_circle(fillOpacity=0.6, stroke="black", strokeOpacity=1)
.properties(
height=alt.Step(10),
width=400,
title=f"{plate} viral barcode counts in no-serum samples",
)
.configure_axis(grid=False)
.configure_legend(titleLimit=1000)
.interactive()
)
display(no_serum_counts_chart)
# drop barcode / wells failing QC
min_no_serum_count_per_viral_barcode_well_drops = list(
no_serum_counts.query("fails_qc")[["barcode", "well"]].itertuples(
index=False, name=None
)
)
print(
f"\nDropping {len(min_no_serum_count_per_viral_barcode_well_drops)} barcode-wells for failing "
f"{qc_thresholds['min_no_serum_count_per_viral_barcode_well']=}: "
+ str(min_no_serum_count_per_viral_barcode_well_drops)
)
qc_drops["barcode_wells"].update(
{
w: "min_no_serum_count_per_viral_barcode_well"
for w in min_no_serum_count_per_viral_barcode_well_drops
}
)
no_serum_counts = no_serum_counts[
~no_serum_counts.assign(
barcode_well=lambda x: x.apply(lambda r: (r["barcode"], r["well"]), axis=1)
)["barcode_well"].isin(qc_drops["barcode_wells"])
]
counts = counts[
~counts.assign(
barcode_well=lambda x: x.apply(lambda r: (r["barcode"], r["well"]), axis=1)
)["barcode_well"].isin(qc_drops["barcode_wells"])
]
Dropping 1 barcode-wells for failing qc_thresholds['min_no_serum_count_per_viral_barcode_well']=50: [('AGCAGTAAATAAAATC', 'E1')]
Compute and plot the median ratio of viral barcode count to neut standard counts across no-serum samples. If library composition is equal, all of these values should be similar:
median_no_serum_ratio = (
no_serum_counts.assign(ratio=lambda x: x["count"] / x["neut_standard_count"])
.groupby(["barcode", "strain"], as_index=False)
.aggregate(median_no_serum_ratio=pd.NamedAgg("ratio", "median"))
)
strain_selection = alt.selection_point(fields=["strain"], on="mouseover", empty=False)
median_no_serum_ratio_chart = (
alt.Chart(median_no_serum_ratio)
.add_params(strain_selection)
.encode(
alt.X(
"median_no_serum_ratio",
title="median ratio of counts",
scale=alt.Scale(nice=False, padding=5),
),
alt.Y(
"barcode",
sort=alt.SortField("median_no_serum_ratio", order="descending"),
axis=alt.Axis(labelFontSize=5),
),
color=alt.condition(strain_selection, alt.value("orange"), alt.value("gray")),
tooltip=[
(
alt.Tooltip(c, format=".3g")
if median_no_serum_ratio[c].dtype == float
else c
)
for c in median_no_serum_ratio.columns
],
)
.mark_bar(height={"band": 0.85})
.properties(
height=alt.Step(5),
width=250,
title=f"{plate} no-serum median ratio viral barcode to neut-standard barcode",
)
.configure_axis(grid=False)
.configure_legend(titleLimit=1000)
)
display(median_no_serum_ratio_chart)
Compute the actual fraction infectivities. We compute both the raw fraction infectivities and the ones with the ceiling applied:
frac_infectivity = (
counts.query("not neut_standard")
.query("serum != 'none'")
.merge(median_no_serum_ratio, validate="many_to_one")
.merge(neut_standard_counts, validate="many_to_one")
.assign(
frac_infectivity_raw=lambda x: (
(x["count"] / x["neut_standard_count"]) / x["median_no_serum_ratio"]
),
frac_infectivity_ceiling=lambda x: x["frac_infectivity_raw"].clip(
upper=curvefit_params["frac_infectivity_ceiling"]
),
concentration=lambda x: 1 / x["dilution_factor"],
plate_barcode=lambda x: x["plate_replicate"] + "-" + x["barcode"],
)[
[
"barcode",
"plate_barcode",
"well",
"strain",
"serum",
"serum_replicate",
"dilution_factor",
"concentration",
"frac_infectivity_raw",
"frac_infectivity_ceiling",
]
]
)
assert len(
frac_infectivity.groupby(["serum", "plate_barcode", "dilution_factor"])
) == len(frac_infectivity)
assert frac_infectivity["dilution_factor"].notnull().all()
assert frac_infectivity["frac_infectivity_raw"].notnull().all()
assert frac_infectivity["frac_infectivity_ceiling"].notnull().all()
Plot the fraction infectivities, both the raw values and with the ceiling applied:
frac_infectivity_chart_df = (
frac_infectivity.assign(
fails_qc=lambda x: (
x["frac_infectivity_raw"]
> qc_thresholds["max_frac_infectivity_per_viral_barcode_well"]
),
)
.melt(
id_vars=[
"barcode",
"strain",
"well",
"serum_replicate",
"dilution_factor",
"fails_qc",
],
value_vars=["frac_infectivity_raw", "frac_infectivity_ceiling"],
var_name="ceiling_applied",
value_name="frac_infectivity",
)
.assign(
ceiling_applied=lambda x: x["ceiling_applied"].map(
{
"frac_infectivity_raw": "raw fraction infectivity",
"frac_infectivity_ceiling": f"fraction infectivity with ceiling at {curvefit_params['frac_infectivity_ceiling']}",
}
)
)
)
frac_infectivity_chart = (
alt.Chart(frac_infectivity_chart_df)
.add_params(strain_selection_dropdown, barcode_selection)
.transform_filter(strain_selection_dropdown)
.encode(
alt.X(
"dilution_factor",
title="dilution factor",
scale=alt.Scale(nice=False, padding=5, type="log"),
),
alt.Y(
"frac_infectivity",
title="fraction infectivity",
scale=alt.Scale(nice=False, padding=5),
),
alt.Column(
"ceiling_applied",
sort="descending",
title=None,
header=alt.Header(labelFontSize=13, labelFontStyle="bold", labelPadding=2),
),
alt.Row(
"serum_replicate",
title=None,
spacing=3,
header=alt.Header(labelFontSize=13, labelFontStyle="bold"),
),
alt.Detail("barcode"),
alt.Shape(
"fails_qc",
title=f"fails {qc_thresholds['max_frac_infectivity_per_viral_barcode_well']=}",
legend=alt.Legend(titleLimit=500, orient="bottom"),
),
color=alt.condition(
barcode_selection, alt.value("black"), alt.value("MediumBlue")
),
strokeWidth=alt.condition(barcode_selection, alt.value(3), alt.value(1)),
opacity=alt.condition(barcode_selection, alt.value(1), alt.value(0.25)),
tooltip=[
(
alt.Tooltip(c, format=".3g")
if frac_infectivity_chart_df[c].dtype == float
else c
)
for c in frac_infectivity_chart_df.columns
],
)
.mark_line(point=True)
.properties(
height=150,
width=250,
title=f"Fraction infectivities for {plate}",
)
.interactive(bind_x=False)
.configure_axis(grid=False)
.configure_legend(titleLimit=1000)
.configure_point(size=50)
.resolve_scale(x="independent", y="independent")
)
display(frac_infectivity_chart)
# drop barcode / wells failing QC
max_frac_infectivity_per_viral_barcode_well_drops = list(
frac_infectivity_chart_df.query("fails_qc")[["barcode", "well"]]
.drop_duplicates()
.itertuples(index=False, name=None)
)
print(
f"\nDropping {len(max_frac_infectivity_per_viral_barcode_well_drops)} barcode-wells for failing "
f"{qc_thresholds['max_frac_infectivity_per_viral_barcode_well']=}: "
+ str(max_frac_infectivity_per_viral_barcode_well_drops)
)
qc_drops["barcode_wells"].update(
{
w: "max_frac_infectivity_per_viral_barcode_well"
for w in max_frac_infectivity_per_viral_barcode_well_drops
}
)
frac_infectivity = frac_infectivity[
~frac_infectivity.assign(
barcode_well=lambda x: x.apply(lambda r: (r["barcode"], r["well"]), axis=1)
)["barcode_well"].isin(qc_drops["barcode_wells"])
]
Dropping 24 barcode-wells for failing qc_thresholds['max_frac_infectivity_per_viral_barcode_well']=4: [('TCCGAAAGACCAAAAC', 'B3'), ('TCCGAAAGACCAAAAC', 'B5'), ('TCCGAAAGACCAAAAC', 'B6'), ('TCCGAAAGACCAAAAC', 'F6'), ('TCCGAAAGACCAAAAC', 'B7'), ('ATACGTATTGATATCT', 'C8'), ('ATACGTATTGATATCT', 'D8'), ('ATACGTATTGATATCT', 'E8'), ('CTCCTAATAAAAAACT', 'F8'), ('ACCCCTTCAGAAGTTA', 'F8'), ('GAATATAAATGGGCAT', 'F8'), ('GCATCCTTTTCCTGTT', 'B9'), ('ATACGTATTGATATCT', 'C9'), ('GAATATAAATGGGCAT', 'D9'), ('GAATATAAATGGGCAT', 'E9'), ('TCCGAAAGACCAAAAC', 'F9'), ('GAATATAAATGGGCAT', 'F9'), ('ATACGTATTGATATCT', 'C10'), ('GAATATAAATGGGCAT', 'D10'), ('ACCCCTTCAGAAGTTA', 'E10'), ('AAAGCCCTAGTTAAGT', 'E10'), ('GAATATAAATGGGCAT', 'G10'), ('TGGACACTTACAACAA', 'B11'), ('GCATCCTTTTCCTGTT', 'F12')]
Check how many dilutions we have per barcode / serum-replicate:
n_dilutions = (
frac_infectivity.groupby(["serum_replicate", "strain", "barcode"], as_index=False)
.aggregate(**{"number of dilutions": pd.NamedAgg("dilution_factor", "nunique")})
.assign(
fails_qc=lambda x: (
x["number of dilutions"]
< qc_thresholds["min_dilutions_per_barcode_serum_replicate"]
),
)
)
n_dilutions_chart = (
alt.Chart(n_dilutions)
.add_params(barcode_selection)
.encode(
alt.X("number of dilutions", scale=alt.Scale(nice=False, padding=4)),
alt.Y("strain", title=None),
alt.Column(
"serum_replicate",
title=None,
header=alt.Header(labelFontSize=12, labelFontStyle="bold", labelPadding=0),
),
alt.Fill(
"fails_qc",
title=f"fails {qc_thresholds['min_dilutions_per_barcode_serum_replicate']=}",
legend=alt.Legend(titleLimit=500, orient="bottom"),
),
strokeWidth=alt.condition(barcode_selection, alt.value(2), alt.value(0)),
size=alt.condition(barcode_selection, alt.value(55), alt.value(35)),
tooltip=[
alt.Tooltip(c, format=".3g") if n_dilutions[c].dtype == float else c
for c in n_dilutions.columns
],
)
.mark_circle(stroke="black", strokeOpacity=1, fillOpacity=0.45)
.properties(
height=alt.Step(10),
width=120,
title=alt.TitleParams(
"number of dilutions for each barcode for each serum-replicate", dy=-2
),
)
)
display(n_dilutions_chart)
# drop barcode / serum-replicates failing QC
min_dilutions_per_barcode_serum_replicate_drops = list(
n_dilutions.query("fails_qc")[["barcode", "serum_replicate"]].itertuples(
index=False, name=None
)
)
print(
f"\nDropping {len(min_dilutions_per_barcode_serum_replicate_drops)} barcode/serum-replicates for failing "
f"{qc_thresholds['min_dilutions_per_barcode_serum_replicate']=}: "
+ str(min_dilutions_per_barcode_serum_replicate_drops)
)
qc_drops["barcode_serum_replicates"].update(
{
w: "min_dilutions_per_barcode_serum_replicate"
for w in min_dilutions_per_barcode_serum_replicate_drops
}
)
frac_infectivity = frac_infectivity[
~frac_infectivity.assign(
barcode_serum_replicate=lambda x: x.apply(
lambda r: (r["barcode"], r["serum_replicate"]), axis=1
)
)["barcode_serum_replicate"].isin(qc_drops["barcode_serum_replicates"])
]
Dropping 0 barcode/serum-replicates for failing qc_thresholds['min_dilutions_per_barcode_serum_replicate']=5: []
Fit neutralization curves without applying QC to curves¶
First fit curves to all serum replicates, then we will apply QC on the curve fits. Note that the fitting is done to the fraction infectivities with the ceiling:
fits_noqc = neutcurve.CurveFits(
frac_infectivity.rename(
columns={
"frac_infectivity_ceiling": "fraction infectivity",
"concentration": "serum concentration",
}
),
conc_col="serum concentration",
fracinf_col="fraction infectivity",
virus_col="strain",
serum_col="serum_replicate",
replicate_col="barcode",
fixtop=curvefit_params["fixtop"],
fixbottom=curvefit_params["fixbottom"],
fixslope=curvefit_params["fixslope"],
)
Determine which fits fail the curve fitting QC, and plot them. Note the plot indicates as failing QC any barcode / serum-replicate that fails, even if we are also specified to ignore the QC for that one (so it will not be removed later):
goodness_of_fit = curvefit_qc["goodness_of_fit"]
fit_params_noqc = (
frac_infectivity.groupby(["serum_replicate", "barcode"], as_index=False)
.aggregate(max_frac_infectivity=pd.NamedAgg("frac_infectivity_ceiling", "max"))
.merge(
fits_noqc.fitParams(average_only=False, no_average=True)[
["serum", "virus", "replicate", "r2", "rmsd"]
].rename(columns={"serum": "serum_replicate", "replicate": "barcode"}),
validate="one_to_one",
)
.assign(
fails_max_frac_infectivity_at_least=lambda x: (
x["max_frac_infectivity"] < curvefit_qc["max_frac_infectivity_at_least"]
),
fails_goodness_of_fit=lambda x: (
(x["r2"] < goodness_of_fit["min_R2"])
& (x["rmsd"] > goodness_of_fit["max_RMSD"])
),
fails_qc=lambda x: (
x["fails_max_frac_infectivity_at_least"] | x["fails_goodness_of_fit"]
),
ignore_qc=lambda x: x.apply(
lambda r: (
(
r["serum_replicate"]
in curvefit_qc["serum_replicates_ignore_curvefit_qc"]
)
or (
(r["barcode"], r["serum_replicate"])
in curvefit_qc["barcode_serum_replicates_ignore_curvefit_qc"]
)
),
axis=1,
),
)
)
print(f"Plotting barcode / serum-replicates that fail {curvefit_qc=}\n")
for prop, col in [
("max frac infectivity", "max_frac_infectivity"),
("curve fit R2", "r2"),
("curve fit RMSD", "rmsd"),
]:
fit_params_noqc_chart = (
alt.Chart(fit_params_noqc)
.add_params(barcode_selection)
.encode(
alt.X(col, title=prop, scale=alt.Scale(nice=False, padding=4)),
alt.Y("virus", title=None),
alt.Fill("fails_qc"),
alt.Column(
"serum_replicate",
title=None,
header=alt.Header(
labelFontSize=12, labelFontStyle="bold", labelPadding=0
),
),
strokeWidth=alt.condition(barcode_selection, alt.value(2), alt.value(0)),
size=alt.condition(barcode_selection, alt.value(55), alt.value(35)),
tooltip=[
alt.Tooltip(c, format=".3g") if fit_params_noqc[c].dtype == float else c
for c in fit_params_noqc.columns
],
)
.mark_circle(stroke="black", strokeOpacity=1, fillOpacity=0.55)
.properties(
height=alt.Step(10),
width=120,
title=alt.TitleParams(f"{prop} for each barcode serum-replicate", dy=-2),
)
)
display(fit_params_noqc_chart)
/fh/fast/bloom_j/computational_notebooks/aloes/2025/flu_seqneut_pdmH1N1_2023-2024_VaccinatedCohorts/.snakemake/conda/de1e1a4710a5bd2a5adf38517b0654d5_/lib/python3.12/site-packages/neutcurve/hillcurve.py:1177: RuntimeWarning: invalid value encountered in power return b + (t - b) / (1 + (c / m) ** s)
/fh/fast/bloom_j/computational_notebooks/aloes/2025/flu_seqneut_pdmH1N1_2023-2024_VaccinatedCohorts/.snakemake/conda/de1e1a4710a5bd2a5adf38517b0654d5_/lib/python3.12/site-packages/neutcurve/hillcurve.py:1177: RuntimeWarning: invalid value encountered in power return b + (t - b) / (1 + (c / m) ** s)
Plotting barcode / serum-replicates that fail curvefit_qc={'max_frac_infectivity_at_least': 0, 'goodness_of_fit': {'min_R2': 0.7, 'max_RMSD': 0.2}, 'serum_replicates_ignore_curvefit_qc': [], 'barcode_serum_replicates_ignore_curvefit_qc': []}
Now get all barcode / serum-replicate pairs that fail any of the QC. Plot curves for just these virus / serum-replicates (we plot all barcodes for a virus even if just one fails QC), and then exclude any that are not specified to ignore the QC:
barcode_serum_replicates_fail_qc = fit_params_noqc.query("fails_qc").reset_index(
drop=True
)
print(f"Here are barcode / serum-replicates that fail {curvefit_qc=}")
display(barcode_serum_replicates_fail_qc)
if len(barcode_serum_replicates_fail_qc):
print("\nCurves for viruses and serum-replicates with at least one failed barcode:")
fig, _ = fits_noqc.plotReplicates(
sera=sorted(barcode_serum_replicates_fail_qc["serum_replicate"].unique()),
viruses=sorted(barcode_serum_replicates_fail_qc["virus"].unique()),
attempt_shared_legend=False,
legendfontsize=8,
titlesize=10,
ticksize=10,
ncol=6,
draw_in_bounds=True,
)
display(fig)
plt.close(fig)
# drop barcode / serum-replicates failing QC
for qc_filter in ["max_frac_infectivity_at_least", "goodness_of_fit"]:
fits_qc_drops = list(
fit_params_noqc.query(f"fails_{qc_filter} and (not ignore_qc)")[
["barcode", "serum_replicate"]
].itertuples(index=False, name=None)
)
print(
f"\nDropping {len(fits_qc_drops)} barcode/serum-replicates for failing "
f"{qc_filter}={curvefit_qc[qc_filter]}: " + str(fits_qc_drops)
)
qc_drops["barcode_serum_replicates"].update({w: qc_filter for w in fits_qc_drops})
frac_infectivity = frac_infectivity[
~frac_infectivity.assign(
barcode_serum_replicate=lambda x: x.apply(
lambda r: (r["barcode"], r["serum_replicate"]), axis=1
)
)["barcode_serum_replicate"].isin(qc_drops["barcode_serum_replicates"])
]
fit_params_noqc = fit_params_noqc[
~fit_params_noqc.assign(
barcode_serum_replicate=lambda x: x.apply(
lambda r: (r["barcode"], r["serum_replicate"]), axis=1
)
)["barcode_serum_replicate"].isin(qc_drops["barcode_serum_replicates"])
]
Here are barcode / serum-replicates that fail curvefit_qc={'max_frac_infectivity_at_least': 0, 'goodness_of_fit': {'min_R2': 0.7, 'max_RMSD': 0.2}, 'serum_replicates_ignore_curvefit_qc': [], 'barcode_serum_replicates_ignore_curvefit_qc': []}
| serum_replicate | barcode | max_frac_infectivity | virus | r2 | rmsd | fails_max_frac_infectivity_at_least | fails_goodness_of_fit | fails_qc | ignore_qc | |
|---|---|---|---|---|---|---|---|---|---|---|
| 0 | DRIVE_y1980_s002_d0 | CCCGACAAAGCCCTCG | 1.0 | A/Thies/1247/2023 | 0.425134 | 0.279764 | False | True | True | False |
| 1 | DRIVE_y1980_s002_d0 | TAACCGGGGAATCATT | 1.0 | A/Philippines/10/2023 | 0.673501 | 0.210739 | False | True | True | False |
| 2 | DRIVE_y1980_s002_d30 | CCAGCCACATAAAATT | 1.0 | A/PaisVasco/1994/2023 | 0.635037 | 0.241041 | False | True | True | False |
| 3 | DRIVE_y1985_s042_d0 | CCACATAGGCGTTTTT | 1.0 | A/Argentina/824/2023 | 0.609149 | 0.247921 | False | True | True | False |
| 4 | DRIVE_y1999_s013_d0 | ACGCCCCCACTTCATG | 1.0 | A/SouthAustralia/179/2023 | 0.234145 | 0.224257 | False | True | True | False |
| 5 | DRIVE_y1999_s013_d0 | AGCCCGAAGAGCCCCT | 1.0 | A/California/75/2023 | 0.010229 | 0.242941 | False | True | True | False |
| 6 | DRIVE_y1999_s013_d0 | AGTACTTCGTACTCCT | 1.0 | A/Perth/110/2023 | 0.012342 | 0.235438 | False | True | True | False |
| 7 | DRIVE_y1999_s013_d0 | CCACATAGGCGTTTTT | 1.0 | A/Argentina/824/2023 | 0.000000 | 0.262011 | False | True | True | False |
| 8 | DRIVE_y1999_s013_d0 | GAGAGTACGGCACTGA | 1.0 | A/Tasmania/140/2023 | 0.354544 | 0.203958 | False | True | True | False |
| 9 | DRIVE_y1999_s013_d0 | TATGACATTAGAAACA | 1.0 | A/Tasmania/140/2023 | 0.163377 | 0.217002 | False | True | True | False |
Curves for viruses and serum-replicates with at least one failed barcode:
Dropping 0 barcode/serum-replicates for failing max_frac_infectivity_at_least=0: []
Dropping 10 barcode/serum-replicates for failing goodness_of_fit={'min_R2': 0.7, 'max_RMSD': 0.2}: [('CCCGACAAAGCCCTCG', 'DRIVE_y1980_s002_d0'), ('TAACCGGGGAATCATT', 'DRIVE_y1980_s002_d0'), ('CCAGCCACATAAAATT', 'DRIVE_y1980_s002_d30'), ('CCACATAGGCGTTTTT', 'DRIVE_y1985_s042_d0'), ('ACGCCCCCACTTCATG', 'DRIVE_y1999_s013_d0'), ('AGCCCGAAGAGCCCCT', 'DRIVE_y1999_s013_d0'), ('AGTACTTCGTACTCCT', 'DRIVE_y1999_s013_d0'), ('CCACATAGGCGTTTTT', 'DRIVE_y1999_s013_d0'), ('GAGAGTACGGCACTGA', 'DRIVE_y1999_s013_d0'), ('TATGACATTAGAAACA', 'DRIVE_y1999_s013_d0')]
Fit neutralization curves after applying QC¶
No we re-fit curves after applying all the QC:
fits_qc = neutcurve.CurveFits(
frac_infectivity.rename(
columns={
"frac_infectivity_ceiling": "fraction infectivity",
"concentration": "serum concentration",
}
),
conc_col="serum concentration",
fracinf_col="fraction infectivity",
virus_col="strain",
serum_col="serum",
replicate_col="plate_barcode",
fixtop=curvefit_params["fixtop"],
fixbottom=curvefit_params["fixbottom"],
fixslope=curvefit_params["fixslope"],
)
fit_params_qc = fits_qc.fitParams(average_only=False, no_average=True)
assert len(fit_params_qc) <= len(
fits_noqc.fitParams(average_only=False, no_average=True)
)
print(f"Assigning fits for this plate to {group}")
fit_params_qc.insert(0, "group", group)
Assigning fits for this plate to DRIVE
Plot all the curves that passed QC:
if fits_qc.sera:
_ = fits_qc.plotReplicates(
attempt_shared_legend=False,
legendfontsize=8,
titlesize=10,
ticksize=10,
ncol=6,
draw_in_bounds=True,
)
else:
print("No sera passed QC.")